Skip to content

Commit

Permalink
eth: don't wait for snap registration if we're not running snap (ethe…
Browse files Browse the repository at this point in the history
…reum#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
  • Loading branch information
holiman committed Feb 5, 2021
1 parent fba5a63 commit 7ed860d
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 11 deletions.
4 changes: 2 additions & 2 deletions eth/peerset.go
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ func newPeerSet() *peerSet {
func (ps *peerSet) registerSnapExtension(peer *snap.Peer) error {
// Reject the peer if it advertises `snap` without `eth` as `snap` is only a
// 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
}
// Ensure nobody can double connect
Expand Down Expand Up @@ -101,7 +101,7 @@ func (ps *peerSet) registerSnapExtension(peer *snap.Peer) error {
// by the peerset.
func (ps *peerSet) waitSnapExtension(peer *eth.Peer) (*snap.Peer, error) {
// 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
}
// Ensure nobody can double connect
Expand Down
17 changes: 8 additions & 9 deletions p2p/peer.go
Original file line number Diff line number Diff line change
Expand Up @@ -158,15 +158,14 @@ func (p *Peer) Caps() []Cap {
return p.rw.caps
}

// SupportsCap returns true if the peer supports any of the enumerated versions
// of a specific protocol.
func (p *Peer) SupportsCap(protocol string, versions []uint) bool {
for _, cap := range p.rw.caps {
if cap.Name == protocol {
for _, ver := range versions {
if cap.Version == ver {
return true
}
// RunningCap returns true if the peer is actively connected using any of the
// enumerated versions of a specific protocol, meaning that at least one of the
// versions is supported by both this node and the peer p.
func (p *Peer) RunningCap(protocol string, versions []uint) bool {
if proto, ok := p.running[protocol]; ok {
for _, ver := range versions {
if proto.Version == ver {
return true
}
}
}
Expand Down

0 comments on commit 7ed860d

Please sign in to comment.