From a30b70220313bfd8083feee051b4093df0cbdb0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Mierzwa?= Date: Tue, 6 Apr 2021 15:20:56 +0100 Subject: [PATCH] fix(backend): avoid potential recursive locks Fixes #2944 --- CHANGELOG.md | 1 + internal/alertmanager/models.go | 16 +++++++++------- 2 files changed, 10 insertions(+), 7 deletions(-) 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) {