Fine-tuning PeerConnector

This commit is contained in:
Vadim Ushakov 2021-10-25 16:12:00 +07:00
parent ce971ab738
commit 8f908c961d

View file

@ -66,6 +66,7 @@ class PeerConnector(object):
self.nr_peers = 0 # set by processReqs() self.nr_peers = 0 # set by processReqs()
self.nr_connected_peers = 0 # set by processReqs2() self.nr_connected_peers = 0 # set by processReqs2()
# Connector Controller state
self.peers = list() self.peers = list()
def addReq(self, req): def addReq(self, req):
@ -139,6 +140,9 @@ class PeerConnector(object):
if peer not in self.peers: if peer not in self.peers:
self.peers.append(peer) self.peers.append(peer)
def sleep(self, t):
self.site.connection_server.sleep(t)
def keepGoing(self): def keepGoing(self):
return self.site.isServing() and self.site.connection_server.allowsCreatingConnections() return self.site.isServing() and self.site.connection_server.allowsCreatingConnections()
@ -153,10 +157,14 @@ class PeerConnector(object):
addendum = 20 addendum = 20
while self.keepGoing(): while self.keepGoing():
if len(self.site.peers) < 1: no_peers_loop = 0
# No peers and no way to manage this from this method. while len(self.site.peers) < 1:
# Just give up. # No peers at all.
break # Waiting for the announcer to discover some peers.
self.sleep(10 + no_peers_loop)
no_peers_loop += 1
if not self.keepGoing() or no_peers_loop > 60:
break
self.processReqs2() self.processReqs2()
@ -165,15 +173,19 @@ class PeerConnector(object):
# Done. # Done.
break break
if len(self.site.peers) < 1:
break
if len(self.peers) < 1: if len(self.peers) < 1:
# refill the peer list # refill the peer list
self.peers = self.site.getRecentPeers(self.need_nr_connected_peers * 2 + addendum) self.peers = self.site.getRecentPeers(self.need_nr_connected_peers * 2 + self.nr_connected_peers + addendum)
addendum = addendum * 2 + 50 addendum = min(addendum * 2 + 50, 10000)
if len(self.peers) <= self.nr_connected_peers: if len(self.peers) <= self.nr_connected_peers:
# looks like all known peers are connected # Looks like all known peers are connected.
# start announcePex() in background and give up # Waiting for the announcer to discover some peers.
self.site.announcer.announcePex() self.site.announcer.announcePex()
break self.sleep(10)
continue
# try connecting to peers # try connecting to peers
while self.keepGoing() and len(self.peer_connector_workers) < self.peer_connector_worker_limit: while self.keepGoing() and len(self.peer_connector_workers) < self.peer_connector_worker_limit:
@ -195,7 +207,10 @@ class PeerConnector(object):
# wait for more room in self.peer_connector_workers # wait for more room in self.peer_connector_workers
while self.keepGoing() and len(self.peer_connector_workers) >= self.peer_connector_worker_limit: while self.keepGoing() and len(self.peer_connector_workers) >= self.peer_connector_worker_limit:
gevent.sleep(2) self.sleep(2)
if not self.site.connection_server.isInternetOnline():
self.sleep(20)
self.peers = list() self.peers = list()
self.peer_connector_controller = None self.peer_connector_controller = None
@ -208,7 +223,9 @@ class PeerConnector(object):
self.processReqs2() self.processReqs2()
if self.need_nr_peers <= self.nr_peers: if self.need_nr_peers <= self.nr_peers:
break break
gevent.sleep(10) self.sleep(10)
if not self.site.connection_server.isInternetOnline():
self.sleep(20)
self.peer_connector_announcer = None self.peer_connector_announcer = None
def spawnPeerConnectorController(self): def spawnPeerConnectorController(self):