1
0
mirror of https://github.com/prometheus/mysqld_exporter.git synced 2025-07-30 06:43:05 +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.",
})
cfg *ini.File
opts = ini.LoadOptions{
// Do not error on nonexistent file to allow empty string as filename input
Loose: true,
@ -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 {
@ -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)