From b16049b4b51314efc96eb6739ae59a2783063b19 Mon Sep 17 00:00:00 2001 From: Andrew Ashikhmin <34320705+yperbasis@users.noreply.github.com> Date: Fri, 21 Jun 2024 13:28:04 +0200 Subject: [PATCH] Fix potential p2p shutdown hangup (#10839) Copy PR #10626 into `main` Co-authored-by: Mark Holt <135143369+mh0lt@users.noreply.github.com> --- p2p/discover/v4_udp.go | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/p2p/discover/v4_udp.go b/p2p/discover/v4_udp.go index 7bb56a96637..9bd8cdb209a 100644 --- a/p2p/discover/v4_udp.go +++ b/p2p/discover/v4_udp.go @@ -606,14 +606,15 @@ func (t *UDPv4) loop() { return case p := <-t.addReplyMatcher: - func() { - mutex.Lock() - defer mutex.Unlock() - p.deadline = time.Now().Add(t.replyTimeout) - listUpdate <- plist.PushBack(p) - }() + mutex.Lock() + p.deadline = time.Now().Add(t.replyTimeout) + back := plist.PushBack(p) + mutex.Unlock() + listUpdate <- back case r := <-t.gotreply: + var removals []*list.Element + func() { mutex.Lock() defer mutex.Unlock() @@ -629,7 +630,7 @@ func (t *UDPv4) loop() { if requestDone { p.errc <- nil plist.Remove(el) - listUpdate <- el + removals = append(removals, el) } // Reset the continuous timeout counter (time drift detection) contTimeouts = 0 @@ -638,6 +639,10 @@ func (t *UDPv4) loop() { r.matched <- matched }() + for _, el := range removals { + listUpdate <- el + } + case key := <-t.gotkey: go func() { if key, err := v4wire.DecodePubkey(crypto.S256(), key); err == nil {