diff --git a/codex/rest/api.nim b/codex/rest/api.nim index 6c3fce33..3d2c680e 100644 --- a/codex/rest/api.nim +++ b/codex/rest/api.nim @@ -93,6 +93,26 @@ proc formatPeerRecord(peerRecord: PeerRecord): JsonNode = } return jobj +proc formatBlockExchangePeers(peers: OrderedTable[PeerId, BlockExcPeerCtx]): JsonNode = + let jarray = newJArray() + for peerId, peerContext in peers.pairs: + let jblocksArray = newJArray() + for cid, presence in peerContext.blocks: + jblocksArray.add(%*{ + "cid": $presence.cid, + "have": $presence.have, + "price": $presence.price + }) + + jarray.add(%*{ + "peerid": $peerId, + "hasBlocks": jblocksArray, + "wants": $peerContext.peerWants.len, + "exchanged": $peerContext.exchanged, + }) + + return jarray + proc initRestApi*(node: CodexNodeRef, conf: CodexConf): RestRouter = var router = RestRouter.init(validate) router.api( @@ -321,6 +341,16 @@ proc initRestApi*(node: CodexNodeRef, conf: CodexConf): RestRouter = trace "debug/peer returning peer record" return RestApiResponse.response($json) + router.api( + MethodGet, + "/api/codex/v1/debug/blockexchange") do () -> RestApiResponse: + let json = %*{ + "peers": formatBlockExchangePeers(node.engine.peers.peers), + "taskQueue": $node.engine.taskQueue.len, + "pendingBlocks": $node.engine.pendingBlocks.blocks.len + } + return RestApiResponse.response($json) + router.api( MethodGet, "/api/codex/v1/sales/slots") do () -> RestApiResponse: diff --git a/codex/stores/repostore.nim b/codex/stores/repostore.nim index 52e06dd4..5a78d431 100644 --- a/codex/stores/repostore.nim +++ b/codex/stores/repostore.nim @@ -294,10 +294,13 @@ method listBlocks*( await idleAsync() iter.finished = queryIter.finished if not queryIter.finished: - if pair =? (await queryIter.next()) and cid =? pair.key: + if pair =? (await queryIter.next()) and key =? pair.key: doAssert pair.data.len == 0 - trace "Retrieved record from repo", cid - return Cid.init(cid.value).option + trace "Retrieved record from repo", key + without cid =? Cid.init(key.value): + error "Could not init Cid for key", key + raise Defect.newException("Repostore: Could not init Cid from key during listBlocks iteration.") + return cid.option return Cid.none