diff --git a/CHANGELOG.md b/CHANGELOG.md index 8f5ff198d..c65f9809b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ - Header values are now sanitised before logging when `log:config` is enabled #2930. +- Fixed a deadlock issue that could cause karma to hang #2944 (@jonaz). ### Added diff --git a/internal/alertmanager/models.go b/internal/alertmanager/models.go index 488f51893..1f727c9e0 100644 --- a/internal/alertmanager/models.go +++ b/internal/alertmanager/models.go @@ -493,12 +493,16 @@ func (am *Alertmanager) setError(err string) { am.lastError = err } -func (am *Alertmanager) Error() string { +func (am *Alertmanager) getLastError() string { am.lock.RLock() defer am.lock.RUnlock() + return am.lastError +} - if am.lastError != "" { - return am.lastError +func (am *Alertmanager) Error() string { + lastError := am.getLastError() + if lastError != "" { + return lastError } configPeers := clusterMembersFromConfig(am) @@ -597,10 +601,8 @@ func (am *Alertmanager) ClusterName() string { } func (am *Alertmanager) IsHealthy() bool { - am.lock.RLock() - defer am.lock.RUnlock() - - return am.lastError == "" + lastError := am.getLastError() + return lastError == "" } func (am *Alertmanager) IsHealthCheckAlert(alert *models.Alert) (string, *healthCheck) {