mirror of
https://github.com/codex-storage/nim-codex-dht.git
synced 2025-02-11 11:26:53 +00:00
introduce waitResponse wrapper
initialize wait for response before sending request. This is needed in cases where the response arrives before moving to the next instruction, such as a directly connected test. Signed-off-by: Csaba Kiraly <csaba.kiraly@gmail.com>
This commit is contained in:
parent
63822e8356
commit
dfff39091b
@ -452,6 +452,11 @@ proc replaceNode(d: Protocol, n: Node) =
|
|||||||
# peers in the routing table.
|
# peers in the routing table.
|
||||||
debug "Message request to bootstrap node failed", src=d.localNode, dst=n
|
debug "Message request to bootstrap node failed", src=d.localNode, dst=n
|
||||||
|
|
||||||
|
proc waitResponse*[T: SomeMessage](d: Protocol, node: Node, msg: T):
|
||||||
|
Future[Option[Message]] =
|
||||||
|
let reqId = RequestId.init(d.rng[])
|
||||||
|
result = d.waitMessage(node, reqId)
|
||||||
|
sendRequest(d, node, msg, reqId)
|
||||||
|
|
||||||
proc waitMessage(d: Protocol, fromNode: Node, reqId: RequestId):
|
proc waitMessage(d: Protocol, fromNode: Node, reqId: RequestId):
|
||||||
Future[Option[Message]] =
|
Future[Option[Message]] =
|
||||||
@ -464,6 +469,12 @@ proc waitMessage(d: Protocol, fromNode: Node, reqId: RequestId):
|
|||||||
res.complete(none(Message))
|
res.complete(none(Message))
|
||||||
d.awaitedMessages[key] = result
|
d.awaitedMessages[key] = result
|
||||||
|
|
||||||
|
proc waitNodeResponses*[T: SomeMessage](d: Protocol, node: Node, msg: T):
|
||||||
|
Future[DiscResult[seq[SignedPeerRecord]]] =
|
||||||
|
let reqId = RequestId.init(d.rng[])
|
||||||
|
result = d.waitNodes(node, reqId)
|
||||||
|
sendRequest(d, node, msg, reqId)
|
||||||
|
|
||||||
proc waitNodes(d: Protocol, fromNode: Node, reqId: RequestId):
|
proc waitNodes(d: Protocol, fromNode: Node, reqId: RequestId):
|
||||||
Future[DiscResult[seq[SignedPeerRecord]]] {.async.} =
|
Future[DiscResult[seq[SignedPeerRecord]]] {.async.} =
|
||||||
## Wait for one or more nodes replies.
|
## Wait for one or more nodes replies.
|
||||||
@ -492,23 +503,20 @@ proc waitNodes(d: Protocol, fromNode: Node, reqId: RequestId):
|
|||||||
discovery_message_requests_outgoing.inc(labelValues = ["no_response"])
|
discovery_message_requests_outgoing.inc(labelValues = ["no_response"])
|
||||||
return err("Nodes message not received in time")
|
return err("Nodes message not received in time")
|
||||||
|
|
||||||
proc sendRequest*[T: SomeMessage](d: Protocol, toId: NodeId, toAddr: Address, m: T):
|
proc sendRequest*[T: SomeMessage](d: Protocol, toId: NodeId, toAddr: Address, m: T,
|
||||||
RequestId =
|
reqId: RequestId) =
|
||||||
let
|
let
|
||||||
reqId = RequestId.init(d.rng[])
|
|
||||||
message = encodeMessage(m, reqId)
|
message = encodeMessage(m, reqId)
|
||||||
|
|
||||||
trace "Send message packet", dstId = toId, toAddr, kind = messageKind(T)
|
trace "Send message packet", dstId = toId, toAddr, kind = messageKind(T)
|
||||||
discovery_message_requests_outgoing.inc()
|
discovery_message_requests_outgoing.inc()
|
||||||
|
|
||||||
d.transport.sendMessage(toId, toAddr, message)
|
d.transport.sendMessage(toId, toAddr, message)
|
||||||
return reqId
|
|
||||||
|
|
||||||
proc sendRequest*[T: SomeMessage](d: Protocol, toNode: Node, m: T):
|
proc sendRequest*[T: SomeMessage](d: Protocol, toNode: Node, m: T,
|
||||||
RequestId =
|
reqId: RequestId) =
|
||||||
doAssert(toNode.address.isSome())
|
doAssert(toNode.address.isSome())
|
||||||
let
|
let
|
||||||
reqId = RequestId.init(d.rng[])
|
|
||||||
message = encodeMessage(m, reqId)
|
message = encodeMessage(m, reqId)
|
||||||
|
|
||||||
trace "Send message packet", dstId = toNode.id,
|
trace "Send message packet", dstId = toNode.id,
|
||||||
@ -516,16 +524,15 @@ proc sendRequest*[T: SomeMessage](d: Protocol, toNode: Node, m: T):
|
|||||||
discovery_message_requests_outgoing.inc()
|
discovery_message_requests_outgoing.inc()
|
||||||
|
|
||||||
d.transport.sendMessage(toNode, message)
|
d.transport.sendMessage(toNode, message)
|
||||||
return reqId
|
|
||||||
|
|
||||||
proc ping*(d: Protocol, toNode: Node):
|
proc ping*(d: Protocol, toNode: Node):
|
||||||
Future[DiscResult[PongMessage]] {.async.} =
|
Future[DiscResult[PongMessage]] {.async.} =
|
||||||
## Send a discovery ping message.
|
## Send a discovery ping message.
|
||||||
##
|
##
|
||||||
## Returns the received pong message or an error.
|
## Returns the received pong message or an error.
|
||||||
let reqId = d.sendRequest(toNode,
|
let
|
||||||
PingMessage(sprSeq: d.localNode.record.seqNum))
|
msg = PingMessage(sprSeq: d.localNode.record.seqNum)
|
||||||
let resp = await d.waitMessage(toNode, reqId)
|
resp = await d.waitResponse(toNode, msg)
|
||||||
|
|
||||||
if resp.isSome():
|
if resp.isSome():
|
||||||
if resp.get().kind == pong:
|
if resp.get().kind == pong:
|
||||||
@ -546,8 +553,9 @@ proc findNode*(d: Protocol, toNode: Node, distances: seq[uint16]):
|
|||||||
##
|
##
|
||||||
## Returns the received nodes or an error.
|
## Returns the received nodes or an error.
|
||||||
## Received SPRs are already validated and converted to `Node`.
|
## Received SPRs are already validated and converted to `Node`.
|
||||||
let reqId = d.sendRequest(toNode, FindNodeMessage(distances: distances))
|
let
|
||||||
let nodes = await d.waitNodes(toNode, reqId)
|
msg = FindNodeMessage(distances: distances)
|
||||||
|
nodes = await d.waitNodeResponses(toNode, msg)
|
||||||
|
|
||||||
if nodes.isOk:
|
if nodes.isOk:
|
||||||
let res = verifyNodesRecords(nodes.get(), toNode, FindNodeResultLimit, distances)
|
let res = verifyNodesRecords(nodes.get(), toNode, FindNodeResultLimit, distances)
|
||||||
@ -564,8 +572,9 @@ proc findNodeFast*(d: Protocol, toNode: Node, target: NodeId):
|
|||||||
##
|
##
|
||||||
## Returns the received nodes or an error.
|
## Returns the received nodes or an error.
|
||||||
## Received SPRs are already validated and converted to `Node`.
|
## Received SPRs are already validated and converted to `Node`.
|
||||||
let reqId = d.sendRequest(toNode, FindNodeFastMessage(target: target))
|
let
|
||||||
let nodes = await d.waitNodes(toNode, reqId)
|
msg = FindNodeFastMessage(target: target)
|
||||||
|
nodes = await d.waitNodeResponses(toNode, msg)
|
||||||
|
|
||||||
if nodes.isOk:
|
if nodes.isOk:
|
||||||
let res = verifyNodesRecords(nodes.get(), toNode, FindNodeResultLimit)
|
let res = verifyNodesRecords(nodes.get(), toNode, FindNodeResultLimit)
|
||||||
@ -581,9 +590,9 @@ proc talkReq*(d: Protocol, toNode: Node, protocol, request: seq[byte]):
|
|||||||
## Send a discovery talkreq message.
|
## Send a discovery talkreq message.
|
||||||
##
|
##
|
||||||
## Returns the received talkresp message or an error.
|
## Returns the received talkresp message or an error.
|
||||||
let reqId = d.sendRequest(toNode,
|
let
|
||||||
TalkReqMessage(protocol: protocol, request: request))
|
msg = TalkReqMessage(protocol: protocol, request: request)
|
||||||
let resp = await d.waitMessage(toNode, reqId)
|
resp = await d.waitResponse(toNode, msg)
|
||||||
|
|
||||||
if resp.isSome():
|
if resp.isSome():
|
||||||
if resp.get().kind == talkResp:
|
if resp.get().kind == talkResp:
|
||||||
@ -707,7 +716,8 @@ proc addProvider*(
|
|||||||
res.add(d.localNode)
|
res.add(d.localNode)
|
||||||
for toNode in res:
|
for toNode in res:
|
||||||
if toNode != d.localNode:
|
if toNode != d.localNode:
|
||||||
discard d.sendRequest(toNode, AddProviderMessage(cId: cId, prov: pr))
|
let reqId = RequestId.init(d.rng[])
|
||||||
|
d.sendRequest(toNode, AddProviderMessage(cId: cId, prov: pr), reqId)
|
||||||
else:
|
else:
|
||||||
asyncSpawn d.addProviderLocal(cId, pr)
|
asyncSpawn d.addProviderLocal(cId, pr)
|
||||||
|
|
||||||
@ -720,8 +730,7 @@ proc sendGetProviders(d: Protocol, toNode: Node,
|
|||||||
trace "sendGetProviders", toNode, msg
|
trace "sendGetProviders", toNode, msg
|
||||||
|
|
||||||
let
|
let
|
||||||
reqId = d.sendRequest(toNode, msg)
|
resp = await d.waitResponse(toNode, msg)
|
||||||
resp = await d.waitMessage(toNode, reqId)
|
|
||||||
|
|
||||||
if resp.isSome():
|
if resp.isSome():
|
||||||
if resp.get().kind == MessageKind.providers:
|
if resp.get().kind == MessageKind.providers:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user