From 86e69e999ec256353680a08c70a23f9f9778c67e Mon Sep 17 00:00:00 2001 From: Zahary Karadjov Date: Fri, 6 Jul 2018 14:14:30 +0300 Subject: [PATCH] work-around an issue with using chronicles logScopes inside async procs --- eth_p2p/kademlia.nim | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/eth_p2p/kademlia.nim b/eth_p2p/kademlia.nim index 8fff76c..730a6f9 100644 --- a/eth_p2p/kademlia.nim +++ b/eth_p2p/kademlia.nim @@ -14,6 +14,9 @@ import asyncdispatch2, eth_keys, stint, nimcrypto, chronicles, enode export sets # TODO: This should not be needed, but compilation fails otherwise +template dbg(name: string, args: varargs[untyped]) = + chronicles.debug(name, topic = "discovery", args) + logScope: topic = "discovery" @@ -322,7 +325,7 @@ proc bond(k: KademliaProtocol, n: Node): Future[bool] {.async.} = let token = k.ping(n) let gotPong = await k.waitPong(n, token) if not gotPong: - debug "bonding failed, didn't receive pong from ", n + dbg "bonding failed, didn't receive pong from ", n # Drop the failing node and schedule a populateNotFullBuckets() call to try and # fill its spot. k.routing.removeNode(n) @@ -335,7 +338,7 @@ proc bond(k: KademliaProtocol, n: Node): Future[bool] {.async.} = discard await k.waitPing(n) echo "bonding completed successfully with" - debug "bonding completed successfully with ", n + dbg "bonding completed successfully with ", n k.updateRoutingTable(n) return true @@ -356,7 +359,7 @@ proc lookup*(k: KademliaProtocol, nodeId: NodeId): Future[seq[Node]] {.async.} = k.wire.sendFindNode(remote, nodeId) var candidates = await k.waitNeighbours(remote) if candidates.len == 0: - debug "got no candidates, returning ", "from" = remote + dbg "got no candidates, returning ", "from" = remote result = candidates else: # The following line: @@ -365,12 +368,12 @@ proc lookup*(k: KademliaProtocol, nodeId: NodeId): Future[seq[Node]] {.async.} = # 2. Removes all previously seen nodes from candidates # 3. Deduplicates candidates candidates.keepItIf(not nodesSeen.containsOrIncl(it)) - debug "got new candidates", count = candidates.len + dbg "got new candidates", count = candidates.len let bonded = await all(candidates.mapIt(k.bond(it))) for i in 0 ..< bonded.len: if not bonded[i]: candidates[i] = nil candidates.keepItIf(not it.isNil) - debug "bonded with candidates", count = candidates.len + dbg "bonded with candidates", count = candidates.len result = candidates proc excludeIfAsked(nodes: seq[Node]): seq[Node] = @@ -378,10 +381,10 @@ proc lookup*(k: KademliaProtocol, nodeId: NodeId): Future[seq[Node]] {.async.} = sortByDistance(result, nodeId, FIND_CONCURRENCY) var closest = k.routing.neighbours(nodeId) - debug "starting lookup; initial neighbours: ", closest + dbg "starting lookup; initial neighbours: ", closest var nodesToAsk = excludeIfAsked(closest) while nodesToAsk.len != 0: - debug "node lookup; querying ", nodesToAsk + dbg "node lookup; querying ", nodesToAsk nodesAsked.incl(nodesToAsk.toSet()) let results = await all(nodesToAsk.mapIt(findNode(nodeId, it))) for candidates in results: @@ -410,14 +413,14 @@ proc bootstrap*(k: KademliaProtocol, bootstrapNodes: seq[Node]) {.async.} = discard await k.lookupRandom() proc recvPong*(k: KademliaProtocol, n: Node, token: seq[byte]) = - debug "<<< pong", "from" = n + dbg "<<< pong", "from" = n let pingid = token & @(n.node.pubkey.data) var future: Future[bool] if k.pongFutures.take(pingid, future): future.complete(true) proc recvPing*(k: KademliaProtocol, n: Node, msgHash: any) = - debug "<<< ping", "from" = n + dbg "<<< ping", "from" = n k.updateRoutingTable(n) k.wire.sendPong(n, msgHash) @@ -432,19 +435,19 @@ proc recvNeighbours*(k: KademliaProtocol, remote: Node, neighbours: seq[Node]) = ## done as part of node lookup, so the actual processing is left to the callback from ## neighbours_callbacks, which is added (and removed after it's done or timed out) in ## wait_neighbours(). - debug "<<< neighbours", "from" = remote, neighbours + dbg "<<< neighbours", "from" = remote, neighbours let cb = k.neighboursCallbacks.getOrDefault(remote) if not cb.isNil: cb(neighbours) else: - debug "unexpected neighbours, probably came too late", "from" = remote + dbg "unexpected neighbours, probably came too late", "from" = remote proc recvFindNode*(k: KademliaProtocol, remote: Node, nodeId: NodeId) = if remote notin k.routing: # FIXME: This is not correct; a node we've bonded before may have become unavailable # and thus removed from self.routing, but once it's back online we should accept # find_nodes from them. - debug "Ignoring find_node request from unknown node ", remote + dbg "Ignoring find_node request from unknown node ", remote return k.updateRoutingTable(remote) var found = k.routing.neighbours(nodeId)