mirror of
https://github.com/status-im/nim-libp2p.git
synced 2025-02-20 00:28:19 +00:00
handle isNotEmpty futures correctly
This commit is contained in:
parent
7db4495360
commit
f34f30de93
@ -19,7 +19,8 @@ import rpc/[messages, message, protobuf],
|
|||||||
../../stream/connection,
|
../../stream/connection,
|
||||||
../../crypto/crypto,
|
../../crypto/crypto,
|
||||||
../../protobuf/minprotobuf,
|
../../protobuf/minprotobuf,
|
||||||
../../utility
|
../../utility,
|
||||||
|
../../utils/future
|
||||||
|
|
||||||
export peerid, connection, deques
|
export peerid, connection, deques
|
||||||
|
|
||||||
@ -271,10 +272,6 @@ proc sendEncoded*(p: PubSubPeer, msg: seq[byte], isHighPriority: bool = false) {
|
|||||||
when defined(libp2p_expensive_metrics):
|
when defined(libp2p_expensive_metrics):
|
||||||
libp2p_gossipsub_non_priority_queue_size.inc(labelValues = [$p.peerId])
|
libp2p_gossipsub_non_priority_queue_size.inc(labelValues = [$p.peerId])
|
||||||
trace "message queued", p, msg = shortLog(msg)
|
trace "message queued", p, msg = shortLog(msg)
|
||||||
if not p.rpcmessagequeue.isProcessing:
|
|
||||||
p.rpcmessagequeue.isProcessing = true
|
|
||||||
p.rpcmessagequeue.messageAvailableEvent.fire()
|
|
||||||
await sleepAsync(0) # give a chance to the task processing the queue to run
|
|
||||||
|
|
||||||
iterator splitRPCMsg(peer: PubSubPeer, rpcMsg: RPCMsg, maxSize: int, anonymize: bool): seq[byte] =
|
iterator splitRPCMsg(peer: PubSubPeer, rpcMsg: RPCMsg, maxSize: int, anonymize: bool): seq[byte] =
|
||||||
## This iterator takes an `RPCMsg` and sequentially repackages its Messages into new `RPCMsg` instances.
|
## This iterator takes an `RPCMsg` and sequentially repackages its Messages into new `RPCMsg` instances.
|
||||||
@ -346,7 +343,6 @@ proc canAskIWant*(p: PubSubPeer, msgId: MessageId): bool =
|
|||||||
|
|
||||||
proc processMessages(p: PubSubPeer) {.async.} =
|
proc processMessages(p: PubSubPeer) {.async.} =
|
||||||
proc sendMsg(msg: seq[byte]) {.async.} =
|
proc sendMsg(msg: seq[byte]) {.async.} =
|
||||||
trace "message dequeued", p, msg = shortLog(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
|
||||||
# complete this even if the sendConn setup failed
|
# complete this even if the sendConn setup failed
|
||||||
@ -371,28 +367,26 @@ proc processMessages(p: PubSubPeer) {.async.} =
|
|||||||
|
|
||||||
await conn.close() # This will clean up the send connection
|
await conn.close() # This will clean up the send connection
|
||||||
while true:
|
while true:
|
||||||
await p.rpcmessagequeue.messageAvailableEvent.wait()
|
var futs = @[p.rpcmessagequeue.priorityQueue.isNotempty(), p.rpcmessagequeue.nonPriorityQueue.isNotempty()]
|
||||||
p.rpcmessagequeue.messageAvailableEvent.clear()
|
try:
|
||||||
|
discard await anyCompleted(futs)#.wait(self.connectTimeout)
|
||||||
|
trace "waiting for message", p
|
||||||
|
finally:
|
||||||
|
for fut in futs: fut.cancel()
|
||||||
|
trace "message available", p
|
||||||
if not p.rpcmessagequeue.priorityQueue.empty():
|
if not p.rpcmessagequeue.priorityQueue.empty():
|
||||||
let message = await p.rpcmessagequeue.priorityQueue.get()
|
let message = p.rpcmessagequeue.priorityQueue.getNoWait()
|
||||||
when defined(libp2p_expensive_metrics):
|
when defined(libp2p_expensive_metrics):
|
||||||
libp2p_gossipsub_priority_queue_messages_processed.inc(labelValues = [$p.peerId])
|
libp2p_gossipsub_priority_queue_size.dec(labelValues = [$p.peerId])
|
||||||
|
trace "message dequeued from priority queue", p, msg = shortLog(message)
|
||||||
await sendMsg(message)
|
await sendMsg(message)
|
||||||
elif not p.rpcmessagequeue.nonPriorityQueue.empty():
|
elif not p.rpcmessagequeue.nonPriorityQueue.empty():
|
||||||
let message = await p.rpcmessagequeue.nonPriorityQueue.get()
|
let message = p.rpcmessagequeue.nonPriorityQueue.getNoWait()
|
||||||
when defined(libp2p_expensive_metrics):
|
when defined(libp2p_expensive_metrics):
|
||||||
libp2p_gossipsub_non_priority_queue_messages_processed.inc(labelValues = [$p.peerId])
|
libp2p_gossipsub_non_priority_queue_size.dec(labelValues = [$p.peerId])
|
||||||
|
trace "message dequeued from non-priority queue", p, msg = shortLog(message)
|
||||||
await sendMsg(message)
|
await sendMsg(message)
|
||||||
|
|
||||||
p.rpcmessagequeue.isProcessing = false
|
|
||||||
|
|
||||||
# Additional logic to re-fire the event if messages are still in the queue
|
|
||||||
if not p.rpcmessagequeue.priorityQueue.empty() or not p.rpcmessagequeue.nonPriorityQueue.empty():
|
|
||||||
p.rpcmessagequeue.isProcessing = true
|
|
||||||
p.rpcmessagequeue.messageAvailableEvent.fire()
|
|
||||||
|
|
||||||
|
|
||||||
proc startProcessingMessages(p: PubSubPeer) =
|
proc startProcessingMessages(p: PubSubPeer) =
|
||||||
if p.rpcmessagequeue.queueProcessingTask.isNil:
|
if p.rpcmessagequeue.queueProcessingTask.isNil:
|
||||||
p.rpcmessagequeue.queueProcessingTask = p.processMessages()
|
p.rpcmessagequeue.queueProcessingTask = p.processMessages()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user