forked from LBRYCommunity/lbry-sdk
stop racing during long streams
This commit is contained in:
parent
73da223ae1
commit
1be5dce30e
1 changed files with 12 additions and 2 deletions
|
@ -24,6 +24,16 @@ class BlobDownloader:
|
||||||
self.ignored: typing.Set['KademliaPeer'] = set()
|
self.ignored: typing.Set['KademliaPeer'] = set()
|
||||||
self.scores: typing.Dict['KademliaPeer', int] = {}
|
self.scores: typing.Dict['KademliaPeer', int] = {}
|
||||||
|
|
||||||
|
def should_race_continue(self):
|
||||||
|
if len(self.active_connections) >= self.config.max_connections_per_download:
|
||||||
|
return False
|
||||||
|
# if a peer won 2 or more blob races and is active as a downloader, stop the race so bandwidth improves
|
||||||
|
# the safe net side is that any failure will reset the peer score, triggering the race back
|
||||||
|
for peer, task in self.active_connections.items():
|
||||||
|
if self.scores.get(peer, 0) >= 2 and not task.done():
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
async def request_blob_from_peer(self, blob: 'BlobFile', peer: 'KademliaPeer'):
|
async def request_blob_from_peer(self, blob: 'BlobFile', peer: 'KademliaPeer'):
|
||||||
if blob.get_is_verified():
|
if blob.get_is_verified():
|
||||||
return
|
return
|
||||||
|
@ -37,7 +47,7 @@ class BlobDownloader:
|
||||||
log.debug("drop peer %s:%i", peer.address, peer.tcp_port)
|
log.debug("drop peer %s:%i", peer.address, peer.tcp_port)
|
||||||
elif keep_connection:
|
elif keep_connection:
|
||||||
log.debug("keep peer %s:%i", peer.address, peer.tcp_port)
|
log.debug("keep peer %s:%i", peer.address, peer.tcp_port)
|
||||||
self.scores[peer] = self.scores.get(peer, 0) + 2 if success else 0
|
self.scores[peer] = (self.scores.get(peer, 0) + 2) if success else 0
|
||||||
|
|
||||||
async def new_peer_or_finished(self, blob: 'BlobFile'):
|
async def new_peer_or_finished(self, blob: 'BlobFile'):
|
||||||
async def get_and_re_add_peers():
|
async def get_and_re_add_peers():
|
||||||
|
@ -70,7 +80,7 @@ class BlobDownloader:
|
||||||
len(batch), len(self.ignored), len(self.active_connections)
|
len(batch), len(self.ignored), len(self.active_connections)
|
||||||
)
|
)
|
||||||
for peer in batch:
|
for peer in batch:
|
||||||
if len(self.active_connections) >= self.config.max_connections_per_download:
|
if not self.should_race_continue():
|
||||||
break
|
break
|
||||||
if peer not in self.active_connections and peer not in self.ignored:
|
if peer not in self.active_connections and peer not in self.ignored:
|
||||||
log.debug("request %s from %s:%i", blob_hash[:8], peer.address, peer.tcp_port)
|
log.debug("request %s from %s:%i", blob_hash[:8], peer.address, peer.tcp_port)
|
||||||
|
|
Loading…
Add table
Reference in a new issue