From 93a95f511a21f06aa80bb05e3a45011bb758e283 Mon Sep 17 00:00:00 2001 From: Vadim Ushakov Date: Mon, 25 Oct 2021 17:59:35 +0700 Subject: [PATCH] Limit the pex request frequency, interval is 120 secs for each peer --- src/Peer/Peer.py | 9 +++++- src/Site/SiteAnnouncer.py | 64 ++++++++++++++++++++++----------------- src/Site/SiteHelpers.py | 2 +- 3 files changed, 45 insertions(+), 30 deletions(-) diff --git a/src/Peer/Peer.py b/src/Peer/Peer.py index 3637c822..72e9c47f 100644 --- a/src/Peer/Peer.py +++ b/src/Peer/Peer.py @@ -44,6 +44,7 @@ class Peer(object): self.time_response = None # Time of last successful response from peer self.time_added = time.time() self.last_ping = None # Last response time for ping + self.last_pex = 0 # Last query/response time for pex self.is_tracker_connection = False # Tracker connection instead of normal peer self.reputation = 0 # More likely to connect if larger self.last_content_json_update = 0.0 # Modify date of last received content.json @@ -305,10 +306,15 @@ class Peer(object): return response_time # Request peer exchange from peer - def pex(self, site=None, need_num=5): + def pex(self, site=None, need_num=5, request_interval=60*2): if not site: site = self.site # If no site defined request peers for this site + if self.last_pex + request_interval >= time.time(): + return False + + self.last_pex = time.time() + # give back 5 connectible peers packed_peers = helper.packPeers(self.site.getConnectablePeers(5, allow_private=False)) request = {"site": site.address, "peers": packed_peers["ipv4"], "need": need_num} @@ -317,6 +323,7 @@ class Peer(object): if packed_peers["ipv6"]: request["peers_ipv6"] = packed_peers["ipv6"] res = self.request("pex", request) + self.last_pex = time.time() if not res or "error" in res: return False added = 0 diff --git a/src/Site/SiteAnnouncer.py b/src/Site/SiteAnnouncer.py index 6a510583..31004d02 100644 --- a/src/Site/SiteAnnouncer.py +++ b/src/Site/SiteAnnouncer.py @@ -302,39 +302,47 @@ class SiteAnnouncer(object): self.updateWebsocket(trackers="announced") @util.Noparallel(blocking=False) - def announcePex(self, query_num=2, need_num=10): - if not self.site.isServing(): - return + def announcePex(self, query_num=2, need_num=10, establish_connections=True): + peers = [] + try: + peer_count = 20 + query_num * 2 - self.updateWebsocket(pex="announcing") + # Wait for some peers to connect + for _ in range(5): + if not self.site.isServing(): + return + peers = self.site.getConnectedPeers(onlyFullyConnected=True) + if len(peers) > 0: + break + time.sleep(2) - peers = self.site.getConnectedPeers() - if len(peers) == 0: # Wait 3s for connections - time.sleep(3) - peers = self.site.getConnectedPeers() + if len(peers) < peer_count and establish_connections: + # Small number of connected peers for this site, connect to any + peers = list(self.site.getRecentPeers(peer_count)) - if len(peers) == 0: # Small number of connected peers for this site, connect to any - peers = list(self.site.getRecentPeers(20)) - need_num = 10 + if len(peers) > 0: + self.updateWebsocket(pex="announcing") - random.shuffle(peers) - done = 0 - total_added = 0 - for peer in peers: - num_added = peer.pex(need_num=need_num) - if num_added is not False: - done += 1 - total_added += num_added - if num_added: - self.site.worker_manager.onPeers() - self.site.updateWebsocket(peers_added=num_added) - else: + random.shuffle(peers) + done = 0 + total_added = 0 + for peer in peers: + if not establish_connections and not peer.isConnected(): + continue + num_added = peer.pex(need_num=need_num) + if num_added is not False: + done += 1 + total_added += num_added + if num_added: + self.site.worker_manager.onPeers() + self.site.updateWebsocket(peers_added=num_added) + if done == query_num: + break time.sleep(0.1) - if done == query_num: - break - self.log.debug("Pex result: from %s peers got %s new peers." % (done, total_added)) - - self.updateWebsocket(pex="announced") + self.log.debug("Pex result: from %s peers got %s new peers." % (done, total_added)) + finally: + if len(peers) > 0: + self.updateWebsocket(pex="announced") def updateWebsocket(self, **kwargs): if kwargs: diff --git a/src/Site/SiteHelpers.py b/src/Site/SiteHelpers.py index 5abcd46e..c095ad66 100644 --- a/src/Site/SiteHelpers.py +++ b/src/Site/SiteHelpers.py @@ -183,7 +183,7 @@ class PeerConnector(object): if len(self.peers) <= self.nr_connected_peers: # Looks like all known peers are connected. # Waiting for the announcer to discover some peers. - self.site.announcer.announcePex() + self.site.announcer.announcePex(establish_connections=False) self.sleep(10) continue