Fix subclass calls to handleDisconnect (#314)

* Fix subclass calls to handleDisconnect

* add peer ID to nil peer debug message
This commit is contained in:
Giovanni Petrantoni 2020-08-06 11:12:52 +09:00 committed by GitHub
parent 5c986cf657
commit 9bbe5e4841
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 29 additions and 21 deletions

View File

@ -36,7 +36,7 @@ method subscribeTopic*(f: FloodSub,
let peer = f.peers.getOrDefault(peerId) let peer = f.peers.getOrDefault(peerId)
if peer == nil: if peer == nil:
debug "subscribeTopic on a nil peer!" debug "subscribeTopic on a nil peer!", peer = peerId
return return
if topic notin f.floodsub: if topic notin f.floodsub:
@ -53,12 +53,15 @@ method subscribeTopic*(f: FloodSub,
method handleDisconnect*(f: FloodSub, peer: PubSubPeer) = method handleDisconnect*(f: FloodSub, peer: PubSubPeer) =
## handle peer disconnects ## handle peer disconnects
for t in toSeq(f.floodsub.keys): ##
if t in f.floodsub:
f.floodsub[t].excl(peer)
procCall PubSub(f).handleDisconnect(peer) procCall PubSub(f).handleDisconnect(peer)
if not(isNil(peer)) and peer.peerInfo notin f.conns:
for t in toSeq(f.floodsub.keys):
if t in f.floodsub:
f.floodsub[t].excl(peer)
method rpcHandler*(f: FloodSub, method rpcHandler*(f: FloodSub,
peer: PubSubPeer, peer: PubSubPeer,
rpcMsgs: seq[RPCMsg]) {.async.} = rpcMsgs: seq[RPCMsg]) {.async.} =

View File

@ -245,27 +245,31 @@ proc heartbeat(g: GossipSub) {.async.} =
method handleDisconnect*(g: GossipSub, peer: PubSubPeer) = method handleDisconnect*(g: GossipSub, peer: PubSubPeer) =
## handle peer disconnects ## handle peer disconnects
##
procCall FloodSub(g).handleDisconnect(peer) procCall FloodSub(g).handleDisconnect(peer)
for t in toSeq(g.gossipsub.keys):
g.gossipsub.removePeer(t, peer)
when defined(libp2p_expensive_metrics): if not(isNil(peer)) and peer.peerInfo notin g.conns:
libp2p_gossipsub_peers_per_topic_gossipsub for t in toSeq(g.gossipsub.keys):
.set(g.gossipsub.peers(t).int64, labelValues = [t]) g.gossipsub.removePeer(t, peer)
for t in toSeq(g.mesh.keys): when defined(libp2p_expensive_metrics):
g.mesh.removePeer(t, peer) libp2p_gossipsub_peers_per_topic_gossipsub
.set(g.gossipsub.peers(t).int64, labelValues = [t])
when defined(libp2p_expensive_metrics): for t in toSeq(g.mesh.keys):
libp2p_gossipsub_peers_per_topic_mesh g.mesh.removePeer(t, peer)
.set(g.mesh.peers(t).int64, labelValues = [t])
for t in toSeq(g.fanout.keys): when defined(libp2p_expensive_metrics):
g.fanout.removePeer(t, peer) libp2p_gossipsub_peers_per_topic_mesh
.set(g.mesh.peers(t).int64, labelValues = [t])
when defined(libp2p_expensive_metrics): for t in toSeq(g.fanout.keys):
libp2p_gossipsub_peers_per_topic_fanout g.fanout.removePeer(t, peer)
.set(g.fanout.peers(t).int64, labelValues = [t])
when defined(libp2p_expensive_metrics):
libp2p_gossipsub_peers_per_topic_fanout
.set(g.fanout.peers(t).int64, labelValues = [t])
method subscribePeer*(p: GossipSub, method subscribePeer*(p: GossipSub,
conn: Connection) = conn: Connection) =
@ -284,7 +288,7 @@ method subscribeTopic*(g: GossipSub,
let peer = g.peers.getOrDefault(peerId) let peer = g.peers.getOrDefault(peerId)
if peer == nil: if peer == nil:
debug "subscribeTopic on a nil peer!" # floodsub method logs a debug line already
return return
if subscribe: if subscribe:

View File

@ -63,6 +63,7 @@ type
method handleDisconnect*(p: PubSub, peer: PubSubPeer) {.base.} = method handleDisconnect*(p: PubSub, peer: PubSubPeer) {.base.} =
## handle peer disconnects ## handle peer disconnects
## ##
if not(isNil(peer)) and peer.peerInfo notin p.conns: if not(isNil(peer)) and peer.peerInfo notin p.conns:
trace "deleting peer", peer = peer.id trace "deleting peer", peer = peer.id
peer.onConnect.fire() # Make sure all pending sends are unblocked peer.onConnect.fire() # Make sure all pending sends are unblocked