1
0
mirror of https://github.com/prometheus/mysqld_exporter.git synced 2025-07-31 17:44:21 +03:00

Fix race condition in ReloadConfig (#760)

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>
This commit is contained in:
Alexander J. Maidak
2024-08-29 01:36:16 -05:00
committed by GitHub
parent 3a996a47d2
commit 263b96d5c0

View File

@ -45,8 +45,6 @@ var (
Help: "Timestamp of the last successful configuration reload.", Help: "Timestamp of the last successful configuration reload.",
}) })
cfg *ini.File
opts = ini.LoadOptions{ opts = ini.LoadOptions{
// Do not error on nonexistent file to allow empty string as filename input // Do not error on nonexistent file to allow empty string as filename input
Loose: true, Loose: true,
@ -97,12 +95,13 @@ func (ch *MySqlConfigHandler) ReloadConfig(filename string, mysqldAddress string
} }
}() }()
if cfg, err = ini.LoadSources( cfg, err := ini.LoadSources(
opts, opts,
[]byte("[client]\npassword = ${MYSQLD_EXPORTER_PASSWORD}\n"), []byte("[client]\npassword = ${MYSQLD_EXPORTER_PASSWORD}\n"),
filename, 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 { if host, port, err = net.SplitHostPort(mysqldAddress); err != nil {
@ -135,12 +134,6 @@ func (ch *MySqlConfigHandler) ReloadConfig(filename string, mysqldAddress string
TlsInsecureSkipVerify: tlsInsecureSkipVerify, 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) err = sec.StrictMapTo(mysqlcfg)
if err != nil { if err != nil {
level.Error(logger).Log("msg", "failed to parse config", "section", sectionName, "err", err) level.Error(logger).Log("msg", "failed to parse config", "section", sectionName, "err", err)