From f05fcaa4899d4c310511b5bd8371ab09d81318b2 Mon Sep 17 00:00:00 2001 From: niuxiaojie81 <85773309@qq.com> Date: Mon, 15 Jan 2024 10:31:41 +0800 Subject: [PATCH] eth: avoid blocking when geth is closed, fix hang in waitSnapExtension --- eth/peerset.go | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/eth/peerset.go b/eth/peerset.go index 9b631497fd..c0c11e3e85 100644 --- a/eth/peerset.go +++ b/eth/peerset.go @@ -131,16 +131,14 @@ func (ps *peerSet) waitSnapExtension(peer *eth.Peer) (*snap.Peer, error) { ps.snapWait[id] = wait ps.lock.Unlock() - for { - select { - case p := <-wait: - return p, nil - case <-ps.quitCh: - ps.lock.Lock() - delete(ps.snapWait, id) - ps.lock.Unlock() - return nil, errPeerSetClosed - } + select { + case p := <-wait: + return p, nil + case <-ps.quitCh: + ps.lock.Lock() + delete(ps.snapWait, id) + ps.lock.Unlock() + return nil, errPeerSetClosed } } @@ -268,6 +266,8 @@ func (ps *peerSet) close() { for _, p := range ps.peers { p.Disconnect(p2p.DiscQuitting) } - close(ps.quitCh) + if !ps.closed { + close(ps.quitCh) + } ps.closed = true }