eth: avoid blocking when geth is closed, fix hang in waitSnapExtension

This commit is contained in:
niuxiaojie81 2024-01-15 10:31:41 +08:00
parent 3758223e35
commit f05fcaa489

View file

@ -131,16 +131,14 @@ func (ps *peerSet) waitSnapExtension(peer *eth.Peer) (*snap.Peer, error) {
ps.snapWait[id] = wait ps.snapWait[id] = wait
ps.lock.Unlock() ps.lock.Unlock()
for { select {
select { case p := <-wait:
case p := <-wait: return p, nil
return p, nil case <-ps.quitCh:
case <-ps.quitCh: ps.lock.Lock()
ps.lock.Lock() delete(ps.snapWait, id)
delete(ps.snapWait, id) ps.lock.Unlock()
ps.lock.Unlock() return nil, errPeerSetClosed
return nil, errPeerSetClosed
}
} }
} }
@ -268,6 +266,8 @@ func (ps *peerSet) close() {
for _, p := range ps.peers { for _, p := range ps.peers {
p.Disconnect(p2p.DiscQuitting) p.Disconnect(p2p.DiscQuitting)
} }
close(ps.quitCh) if !ps.closed {
close(ps.quitCh)
}
ps.closed = true ps.closed = true
} }