From 29831f840c7fe4b2d804aff5826f9c48d295c851 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Giedrius=20Statkevi=C4=8Dius?= Date: Fri, 9 Feb 2024 15:06:49 +0200 Subject: [PATCH] receive/handler: do not double lock (#7124) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit markPeerUnavailable was always taking a lock and in one case we were calling it with a lock already taken. Fix this. Signed-off-by: Giedrius Statkevičius --- pkg/receive/handler.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pkg/receive/handler.go b/pkg/receive/handler.go index 52d194125f..5756296db3 100644 --- a/pkg/receive/handler.go +++ b/pkg/receive/handler.go @@ -1376,7 +1376,7 @@ func (p *peerGroup) getConnection(ctx context.Context, addr string) (WriteableSt } conn, err := p.dialer(ctx, addr, p.dialOpts...) if err != nil { - p.markPeerUnavailable(addr) + p.markPeerUnavailableUnlocked(addr) dialError := errors.Wrap(err, "failed to dial peer") return nil, errors.Wrap(dialError, errUnavailable.Error()) } @@ -1389,6 +1389,10 @@ func (p *peerGroup) markPeerUnavailable(addr string) { p.m.Lock() defer p.m.Unlock() + p.markPeerUnavailableUnlocked(addr) +} + +func (p *peerGroup) markPeerUnavailableUnlocked(addr string) { state, ok := p.peerStates[addr] if !ok { state = &retryState{attempt: -1}