Wrap "async for" over IterativeXXXFinder in try/finally ensuring aclose().

This commit is contained in:
Jonathan Moody 2022-04-12 12:49:32 -04:00
parent 82d7f81f41
commit 4767bb9dee

View file

@ -217,9 +217,13 @@ class Node:
shortlist: typing.Optional[typing.List['KademliaPeer']] = None shortlist: typing.Optional[typing.List['KademliaPeer']] = None
) -> typing.List['KademliaPeer']: ) -> typing.List['KademliaPeer']:
peers = [] peers = []
async for iteration_peers in self.get_iterative_node_finder( node_finder = self.get_iterative_node_finder(
node_id, shortlist=shortlist, max_results=max_results): node_id, shortlist=shortlist, max_results=max_results)
try:
async for iteration_peers in node_finder:
peers.extend(iteration_peers) peers.extend(iteration_peers)
finally:
await node_finder.aclose()
distance = Distance(node_id) distance = Distance(node_id)
peers.sort(key=lambda peer: distance(peer.node_id)) peers.sort(key=lambda peer: distance(peer.node_id))
return peers[:count] return peers[:count]
@ -245,8 +249,9 @@ class Node:
# prioritize peers who reply to a dht ping first # prioritize peers who reply to a dht ping first
# this minimizes attempting to make tcp connections that won't work later to dead or unreachable peers # this minimizes attempting to make tcp connections that won't work later to dead or unreachable peers
value_finder = self.get_iterative_value_finder(bytes.fromhex(blob_hash))
async for results in self.get_iterative_value_finder(bytes.fromhex(blob_hash)): try:
async for results in value_finder:
to_put = [] to_put = []
for peer in results: for peer in results:
if peer.address == self.protocol.external_ip and self.protocol.peer_port == peer.tcp_port: if peer.address == self.protocol.external_ip and self.protocol.peer_port == peer.tcp_port:
@ -275,6 +280,8 @@ class Node:
log.debug("skip bad peer %s:%i for %s", peer.address, peer.tcp_port, blob_hash) log.debug("skip bad peer %s:%i for %s", peer.address, peer.tcp_port, blob_hash)
if to_put: if to_put:
result_queue.put_nowait(to_put) result_queue.put_nowait(to_put)
finally:
await value_finder.aclose()
def accumulate_peers(self, search_queue: asyncio.Queue, def accumulate_peers(self, search_queue: asyncio.Queue,
peer_queue: typing.Optional[asyncio.Queue] = None peer_queue: typing.Optional[asyncio.Queue] = None