schedule the download task instead

This commit is contained in:
Victor Shyba 2021-10-19 22:06:41 -03:00
parent 04d2c6f013
commit 355ccb1e32

View file

@ -391,6 +391,7 @@ class BackgroundDownloader(Component):
self.download_loop_delay_seconds = 60 self.download_loop_delay_seconds = 60
self.finished_iteration = asyncio.Event() self.finished_iteration = asyncio.Event()
self.requested_blobs = deque(maxlen=10) self.requested_blobs = deque(maxlen=10)
self.ongoing_download: typing.Optional[asyncio.Task] = None
@property @property
def component(self) -> 'BackgroundDownloader': def component(self) -> 'BackgroundDownloader':
@ -404,10 +405,10 @@ class BackgroundDownloader(Component):
if self.component_manager.has_component(DHT_COMPONENT): if self.component_manager.has_component(DHT_COMPONENT):
node = self.component_manager.get_component(DHT_COMPONENT) node = self.component_manager.get_component(DHT_COMPONENT)
self.requested_blobs = node.protocol.data_store.requested_blobs self.requested_blobs = node.protocol.data_store.requested_blobs
if self.requested_blobs: if self.requested_blobs and (not self.ongoing_download or self.ongoing_download.done()):
blob_hash = self.requested_blobs.pop() blob_hash = self.requested_blobs.pop()
await self.download_blobs(blob_hash) self.ongoing_download = asyncio.create_task(self.download_blobs(blob_hash))
self.finished_iteration.set() self.ongoing_download.add_done_callback(lambda _: self.finished_iteration.set())
self.finished_iteration.clear() self.finished_iteration.clear()
await asyncio.sleep(self.download_loop_delay_seconds) await asyncio.sleep(self.download_loop_delay_seconds)
@ -428,6 +429,8 @@ class BackgroundDownloader(Component):
self.task = asyncio.create_task(self.loop()) self.task = asyncio.create_task(self.loop())
async def stop(self): async def stop(self):
if self.ongoing_download and not self.ongoing_download.done():
self.ongoing_download.cancel()
self.task.cancel() self.task.cancel()