mirror of
https://github.com/vacp2p/nim-libp2p.git
synced 2025-03-03 17:40:38 +00:00
clean up after peer is disconnected
This commit is contained in:
parent
a649c3162b
commit
aa29406c96
@ -92,6 +92,7 @@ proc colocationFactor(g: GossipSub, peer: PubSubPeer): float64 =
|
|||||||
proc disconnectPeer*(g: GossipSub, peer: PubSubPeer) {.async.} =
|
proc disconnectPeer*(g: GossipSub, peer: PubSubPeer) {.async.} =
|
||||||
try:
|
try:
|
||||||
await g.switch.disconnect(peer.peerId)
|
await g.switch.disconnect(peer.peerId)
|
||||||
|
peer.stopProcessingMessages()
|
||||||
except CatchableError as exc: # Never cancelled
|
except CatchableError as exc: # Never cancelled
|
||||||
trace "Failed to close connection", peer, error = exc.name, msg = exc.msg
|
trace "Failed to close connection", peer, error = exc.name, msg = exc.msg
|
||||||
|
|
||||||
|
@ -74,7 +74,8 @@ type
|
|||||||
behaviourPenalty*: float64 # the eventual penalty score
|
behaviourPenalty*: float64 # the eventual penalty score
|
||||||
overheadRateLimitOpt*: Opt[TokenBucket]
|
overheadRateLimitOpt*: Opt[TokenBucket]
|
||||||
|
|
||||||
rpcmessagequeue*: RpcMessageQueue
|
rpcmessagequeue: RpcMessageQueue
|
||||||
|
queueProcessingTask: Future[void]
|
||||||
|
|
||||||
RPCHandler* = proc(peer: PubSubPeer, data: seq[byte]): Future[void]
|
RPCHandler* = proc(peer: PubSubPeer, data: seq[byte]): Future[void]
|
||||||
{.gcsafe, raises: [].}
|
{.gcsafe, raises: [].}
|
||||||
@ -346,9 +347,9 @@ proc getMessage(rpcMessageQueue: RpcMessageQueue, p: PubSubPeer): Opt[seq[byte]]
|
|||||||
else:
|
else:
|
||||||
return Opt.none(seq[byte])
|
return Opt.none(seq[byte])
|
||||||
|
|
||||||
proc processMessages(p: PubSubPeer, queue: RpcMessageQueue) {.async.} =
|
proc processMessages(p: PubSubPeer) {.async.} =
|
||||||
while true:
|
while true:
|
||||||
let m = queue.getMessage(p)
|
let m = p.rpcmessagequeue.getMessage(p)
|
||||||
m.withValue(msg):
|
m.withValue(msg):
|
||||||
if p.sendConn == nil:
|
if p.sendConn == nil:
|
||||||
# Wait for a send conn to be setup. `connectOnce` will
|
# Wait for a send conn to be setup. `connectOnce` will
|
||||||
@ -376,6 +377,17 @@ proc processMessages(p: PubSubPeer, queue: RpcMessageQueue) {.async.} =
|
|||||||
# Include a delay or a mechanism to prevent this loop from consuming too much CPU
|
# Include a delay or a mechanism to prevent this loop from consuming too much CPU
|
||||||
await sleepAsync(10) # For example, a 10 ms sleep
|
await sleepAsync(10) # For example, a 10 ms sleep
|
||||||
|
|
||||||
|
proc startProcessingMessages(p: PubSubPeer) =
|
||||||
|
if p.queueProcessingTask.isNil:
|
||||||
|
p.queueProcessingTask = p.processMessages()
|
||||||
|
|
||||||
|
proc stopProcessingMessages*(p: PubSubPeer) =
|
||||||
|
if not p.queueProcessingTask.isNil:
|
||||||
|
p.queueProcessingTask.cancel()
|
||||||
|
p.rpcmessagequeue.clear()
|
||||||
|
libp2p_gossipsub_priority_queue_size.set(labelValues = [$p.peerId], value = 0)
|
||||||
|
libp2p_gossipsub_non_priority_queue_size.set(labelValues = [$p.peerId], value = 0)
|
||||||
|
|
||||||
proc new*(
|
proc new*(
|
||||||
T: typedesc[PubSubPeer],
|
T: typedesc[PubSubPeer],
|
||||||
peerId: PeerId,
|
peerId: PeerId,
|
||||||
@ -397,4 +409,4 @@ proc new*(
|
|||||||
)
|
)
|
||||||
result.sentIHaves.addFirst(default(HashSet[MessageId]))
|
result.sentIHaves.addFirst(default(HashSet[MessageId]))
|
||||||
result.heDontWants.addFirst(default(HashSet[MessageId]))
|
result.heDontWants.addFirst(default(HashSet[MessageId]))
|
||||||
asyncSpawn result.processMessages(result.rpcmessagequeue)
|
result.startProcessingMessages()
|
||||||
|
@ -48,3 +48,7 @@ proc getNonPriorityMessage*(rpcMessageQueue: RpcMessageQueue): Opt[seq[byte]] =
|
|||||||
Opt.none(seq[byte])
|
Opt.none(seq[byte])
|
||||||
else:
|
else:
|
||||||
Opt.none(seq[byte])
|
Opt.none(seq[byte])
|
||||||
|
|
||||||
|
proc clear*(rpcMessageQueue: RpcMessageQueue) =
|
||||||
|
rpcMessageQueue.priorityQueue.clear()
|
||||||
|
rpcMessageQueue.nonPriorityQueue.clear()
|
Loading…
x
Reference in New Issue
Block a user