From 1b0604926f0eafc0ee01b97bdb82a97643331b02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Giedrius=20Statkevi=C4=8Dius?= Date: Thu, 8 Feb 2024 15:16:08 +0200 Subject: [PATCH] receive/handler: do not double lock markPeerUnavailable was always taking a lock and in one case we were calling it with a lock already taken. Fix this. --- 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 d405f24fdf..5d15bafef3 100644 --- a/pkg/receive/handler.go +++ b/pkg/receive/handler.go @@ -1454,7 +1454,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()) } @@ -1467,6 +1467,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}