From ec4f0d4a84b497574b4e39b2cb62075a5783fc2a Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Tue, 8 Oct 2024 10:43:06 +0200 Subject: [PATCH] add transport level RTT measurement Signed-off-by: Csaba Kiraly --- .../private/eth/p2p/discoveryv5/transport.nim | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/codexdht/private/eth/p2p/discoveryv5/transport.nim b/codexdht/private/eth/p2p/discoveryv5/transport.nim index 6049504..36df7a7 100644 --- a/codexdht/private/eth/p2p/discoveryv5/transport.nim +++ b/codexdht/private/eth/p2p/discoveryv5/transport.nim @@ -25,7 +25,7 @@ type client: Client bindAddress: Address ## UDP binding address transp: DatagramTransport - pendingRequests: Table[AESGCMNonce, PendingRequest] + pendingRequests: Table[AESGCMNonce, (PendingRequest, Moment)] keyexchangeInProgress: HashSet[NodeId] pendingRequestsByNode: Table[NodeId, seq[seq[byte]]] codec*: Codec @@ -70,7 +70,7 @@ proc sendMessage*(t: Transport, toId: NodeId, toAddr: Address, message: seq[byte proc registerRequest(t: Transport, n: Node, message: seq[byte], nonce: AESGCMNonce) = let request = PendingRequest(node: n, message: message) - if not t.pendingRequests.hasKeyOrPut(nonce, request): + if not t.pendingRequests.hasKeyOrPut(nonce, (request, Moment.now())): sleepAsync(responseTimeout).addCallback() do(data: pointer): t.pendingRequests.del(nonce) @@ -165,9 +165,16 @@ proc receive*(t: Transport, a: Address, packet: openArray[byte]) = of Flag.Whoareyou: trace "Received whoareyou packet", myport = t.bindAddress.port, address = a - var pr: PendingRequest - if t.pendingRequests.take(packet.whoareyou.requestNonce, pr): - let toNode = pr.node + var + prt: (PendingRequest, Moment) + if t.pendingRequests.take(packet.whoareyou.requestNonce, prt): + let + pr = prt[0] + startTime = prt[1] + toNode = pr.node + rtt = Moment.now() - startTime + # trace "whoareyou RTT:", rtt, node = toNode + toNode.registerRtt(rtt) # This is a node we previously contacted and thus must have an address. doAssert(toNode.address.isSome()) let address = toNode.address.get()