diff --git a/codex/blockexchange/engine/engine.nim b/codex/blockexchange/engine/engine.nim index 02ff9ba8..07656f3f 100644 --- a/codex/blockexchange/engine/engine.nim +++ b/codex/blockexchange/engine/engine.nim @@ -78,10 +78,9 @@ declareCounter( ) declareCounter( codex_block_exchange_requests_failed_total, - "Total number of block requests that failed after exhausting retries" + "Total number of block requests that failed after exhausting retries", ) - const DefaultMaxPeersPerRequest* = 10 # The default max message length of nim-libp2p is 100 megabytes, meaning we can @@ -296,7 +295,7 @@ proc downloadInternal( let scheduledPeer = if not self.pendingBlocks.isRequested(address): let peer = self.selectPeer(peers.with) - self.pendingBlocks.markRequested(address, peer.id) + discard self.pendingBlocks.markRequested(address, peer.id) peer.blockRequestScheduled(address) trace "Request block from block retry loop" await self.sendWantBlock(@[address], peer) @@ -429,12 +428,11 @@ proc blockPresenceHandler*( let ourWantCids = ourWantList.filterIt( it in peerHave and not self.pendingBlocks.retriesExhausted(it) and - not self.pendingBlocks.isRequested(it) + self.pendingBlocks.markRequested(it, peer) ).toSeq for address in ourWantCids: self.pendingBlocks.decRetries(address) - self.pendingBlocks.markRequested(address, peer) peerCtx.blockRequestScheduled(address) if ourWantCids.len > 0: diff --git a/codex/blockexchange/engine/pendingblocks.nim b/codex/blockexchange/engine/pendingblocks.nim index 48233bba..7aa29a18 100644 --- a/codex/blockexchange/engine/pendingblocks.nim +++ b/codex/blockexchange/engine/pendingblocks.nim @@ -142,15 +142,18 @@ func getRequestPeer*(self: PendingBlocksManager, address: BlockAddress): ?PeerId self.blocks.withValue(address, pending): result = pending[].requested -proc markRequested*(self: PendingBlocksManager, address: BlockAddress, peer: PeerId) = +proc markRequested*( + self: PendingBlocksManager, address: BlockAddress, peer: PeerId +): bool = ## Marks this block as having been requested to a peer ## if self.isRequested(address): - error "Attempt to request block twice", address = address, peer = peer + return false self.blocks.withValue(address, pending): pending[].requested = peer.some + return true proc clearRequest*( self: PendingBlocksManager, address: BlockAddress, peer: ?PeerId = PeerId.none