Przeglądaj źródła

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
Martin Holst Swende 4 lat temu
rodzic
commit
7ed860d4f1
2 zmienionych plików z 10 dodań i 11 usunięć
  1. 2 2
      eth/peerset.go
  2. 8 9
      p2p/peer.go

+ 2 - 2
eth/peerset.go

@@ -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
@@ -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

+ 8 - 9
p2p/peer.go

@@ -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
 			}
 		}
 	}