Skip to content

Commit

Permalink
Fix race condition in ReloadConfig (#760)
Browse files Browse the repository at this point in the history
Calling ReloadConfig was not thread safe in spite of mutex.  One thread
could overwrite the package level cfg pointer after it was mutated by
another thread.

Signed-off-by: Alexander J. Maidak <ajmaidak@gmail.com>
  • Loading branch information
ajmaidak authored Aug 29, 2024
1 parent 3a996a4 commit 263b96d
Showing 1 changed file with 4 additions and 11 deletions.
15 changes: 4 additions & 11 deletions config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,6 @@ var (
Help: "Timestamp of the last successful configuration reload.",
})

cfg *ini.File

opts = ini.LoadOptions{
// Do not error on nonexistent file to allow empty string as filename input
Loose: true,
Expand Down Expand Up @@ -97,12 +95,13 @@ func (ch *MySqlConfigHandler) ReloadConfig(filename string, mysqldAddress string
}
}()

if cfg, err = ini.LoadSources(
cfg, err := ini.LoadSources(
opts,
[]byte("[client]\npassword = ${MYSQLD_EXPORTER_PASSWORD}\n"),
filename,
); err != nil {
return fmt.Errorf("failed to load %s: %w", filename, err)
)
if err != nil {
return fmt.Errorf("failed to load config from %s: %w", filename, err)
}

if host, port, err = net.SplitHostPort(mysqldAddress); err != nil {
Expand Down Expand Up @@ -135,12 +134,6 @@ func (ch *MySqlConfigHandler) ReloadConfig(filename string, mysqldAddress string
TlsInsecureSkipVerify: tlsInsecureSkipVerify,
}

// FIXME: this error check seems orphaned
if err != nil {
level.Error(logger).Log("msg", "failed to load config", "section", sectionName, "err", err)
continue
}

err = sec.StrictMapTo(mysqlcfg)
if err != nil {
level.Error(logger).Log("msg", "failed to parse config", "section", sectionName, "err", err)
Expand Down

0 comments on commit 263b96d

Please sign in to comment.