eth: don't wait for snap registration if we're not running snap (#22272)
Prevents a situation where we (not running snap) connects with a peer running snap, and get stalled waiting for snap registration to succeed (which will never happen), which cause a waitgroup wait to halt shutdown
This commit is contained in:
parent
fba5a63afe
commit
7ed860d4f1
@ -73,7 +73,7 @@ func newPeerSet() *peerSet {
|
|||||||
func (ps *peerSet) registerSnapExtension(peer *snap.Peer) error {
|
func (ps *peerSet) registerSnapExtension(peer *snap.Peer) error {
|
||||||
// Reject the peer if it advertises `snap` without `eth` as `snap` is only a
|
// Reject the peer if it advertises `snap` without `eth` as `snap` is only a
|
||||||
// satellite protocol meaningful with the chain selection of `eth`
|
// satellite protocol meaningful with the chain selection of `eth`
|
||||||
if !peer.SupportsCap(eth.ProtocolName, eth.ProtocolVersions) {
|
if !peer.RunningCap(eth.ProtocolName, eth.ProtocolVersions) {
|
||||||
return errSnapWithoutEth
|
return errSnapWithoutEth
|
||||||
}
|
}
|
||||||
// Ensure nobody can double connect
|
// Ensure nobody can double connect
|
||||||
@ -101,7 +101,7 @@ func (ps *peerSet) registerSnapExtension(peer *snap.Peer) error {
|
|||||||
// by the peerset.
|
// by the peerset.
|
||||||
func (ps *peerSet) waitSnapExtension(peer *eth.Peer) (*snap.Peer, error) {
|
func (ps *peerSet) waitSnapExtension(peer *eth.Peer) (*snap.Peer, error) {
|
||||||
// If the peer does not support a compatible `snap`, don't wait
|
// If the peer does not support a compatible `snap`, don't wait
|
||||||
if !peer.SupportsCap(snap.ProtocolName, snap.ProtocolVersions) {
|
if !peer.RunningCap(snap.ProtocolName, snap.ProtocolVersions) {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
// Ensure nobody can double connect
|
// Ensure nobody can double connect
|
||||||
|
17
p2p/peer.go
17
p2p/peer.go
@ -158,15 +158,14 @@ func (p *Peer) Caps() []Cap {
|
|||||||
return p.rw.caps
|
return p.rw.caps
|
||||||
}
|
}
|
||||||
|
|
||||||
// SupportsCap returns true if the peer supports any of the enumerated versions
|
// RunningCap returns true if the peer is actively connected using any of the
|
||||||
// of a specific protocol.
|
// enumerated versions of a specific protocol, meaning that at least one of the
|
||||||
func (p *Peer) SupportsCap(protocol string, versions []uint) bool {
|
// versions is supported by both this node and the peer p.
|
||||||
for _, cap := range p.rw.caps {
|
func (p *Peer) RunningCap(protocol string, versions []uint) bool {
|
||||||
if cap.Name == protocol {
|
if proto, ok := p.running[protocol]; ok {
|
||||||
for _, ver := range versions {
|
for _, ver := range versions {
|
||||||
if cap.Version == ver {
|
if proto.Version == ver {
|
||||||
return true
|
return true
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user