You've already forked mysqld_exporter
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:
committed by
GitHub
parent
3a996a47d2
commit
263b96d5c0
@ -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)
|
||||||
|
Reference in New Issue
Block a user