From 18af2dcd4e9cf9bf9108a2e94aaae713654b3f9d Mon Sep 17 00:00:00 2001 From: Victor Shyba Date: Mon, 13 May 2019 02:52:24 -0300 Subject: [PATCH] remove peer immediately instead of probing when its bad during search --- lbrynet/dht/protocol/iterative_find.py | 3 +++ lbrynet/dht/protocol/protocol.py | 9 ++++++--- tests/integration/test_dht.py | 4 ++-- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/lbrynet/dht/protocol/iterative_find.py b/lbrynet/dht/protocol/iterative_find.py index 94cebb609..6516d7114 100644 --- a/lbrynet/dht/protocol/iterative_find.py +++ b/lbrynet/dht/protocol/iterative_find.py @@ -181,6 +181,9 @@ class IterativeFinder: if added >= constants.alpha: break origin_address = (peer.address, peer.udp_port) + if self.peer_manager.peer_is_good(peer) is False: + self.protocol.remove_peer(peer) + continue if origin_address in self.exclude: continue if peer.node_id == self.protocol.node_id: diff --git a/lbrynet/dht/protocol/protocol.py b/lbrynet/dht/protocol/protocol.py index 7474218e5..c9c0a7c4f 100644 --- a/lbrynet/dht/protocol/protocol.py +++ b/lbrynet/dht/protocol/protocol.py @@ -376,12 +376,16 @@ class KademliaProtocol(DatagramProtocol): self.routing_table.buckets[bucket_index].remove_peer(to_replace) return await self._add_peer(peer) - def add_peer(self, peer: 'KademliaPeer') -> bool: + def add_peer(self, peer: 'KademliaPeer'): if peer.node_id == self.node_id: return False self._to_add.add(peer) self._wakeup_routing_task.set() + def remove_peer(self, peer: 'KademliaPeer'): + self._to_remove.add(peer) + self._wakeup_routing_task.set() + async def routing_table_task(self): while True: while self._to_remove: @@ -558,8 +562,7 @@ class KademliaProtocol(DatagramProtocol): except (asyncio.TimeoutError, RemoteException): self.peer_manager.report_failure(peer.address, peer.udp_port) if self.peer_manager.peer_is_good(peer) is False: - self._to_remove.add(peer) - self._wakeup_routing_task.set() + self.remove_peer(peer) raise def send_response(self, peer: 'KademliaPeer', response: ResponseDatagram): diff --git a/tests/integration/test_dht.py b/tests/integration/test_dht.py index cccf2e8f9..cf03231ca 100644 --- a/tests/integration/test_dht.py +++ b/tests/integration/test_dht.py @@ -109,6 +109,6 @@ class DHTIntegrationTest(AsyncioTestCase): self.assertFalse(node1.protocol.peer_manager.peer_is_good(peer)) # now a search happens, which removes bad peers while contacting them - self.assertTrue(node1.protocol.routing_table.get_peers()) + self.assertNotIn(peer, node1.protocol._to_remove) await node1.peer_search(node2.protocol.node_id) - self.assertFalse(node1.protocol.routing_table.get_peers()) + self.assertIn(peer, node1.protocol._to_remove)