diff options
| author | 2021-01-13 21:28:21 +0100 | |
|---|---|---|
| committer | 2021-01-14 05:01:14 +0100 | |
| commit | f3323503ff84b67ae2b8d4412001238937b7f684 (patch) | |
| tree | 856b46ee01355f11ca6d8ba42622dc3699d539f4 | |
| parent | Correct return type annotation (diff) | |
Use different task ids for every inventory reschedule attempts
The scheduler can't keep track of multiple tasks with the same id,
and rescheduling the update task using the same id within an already
scheduled update task caused the new task to get ignored as the old task
only got deleted from the scheduler after it was finished
| -rw-r--r-- | bot/exts/info/doc/_cog.py | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/bot/exts/info/doc/_cog.py b/bot/exts/info/doc/_cog.py index ac74e7997..43407d5ba 100644 --- a/bot/exts/info/doc/_cog.py +++ b/bot/exts/info/doc/_cog.py @@ -66,7 +66,7 @@ class DocCog(commands.Cog): self.renamed_symbols = defaultdict(list) self.inventory_scheduler = Scheduler(self.__class__.__name__) - self.scheduled_inventories = set() + self.inventory_reschedule_attempts = defaultdict(int) self.refresh_event = asyncio.Event() self.refresh_event.set() @@ -134,20 +134,20 @@ class DocCog(commands.Cog): package = await fetch_inventory(inventory_url) if not package: - if inventory_url not in self.scheduled_inventories: + attempt = self.inventory_reschedule_attempts[package] + self.inventory_reschedule_attempts[package] += 1 + if attempt == 0: delay = FETCH_RESCHEDULE_DELAY.first else: delay = FETCH_RESCHEDULE_DELAY.repeated log.info(f"Failed to fetch inventory; attempting again in {delay} minutes.") self.inventory_scheduler.schedule_later( delay*60, - api_package_name, + (attempt, api_package_name), self.update_or_reschedule_inventory(api_package_name, base_url, inventory_url) ) - self.scheduled_inventories.add(api_package_name) return - self.scheduled_inventories.discard(api_package_name) self.update_single(api_package_name, base_url, package) def ensure_unique_symbol_name( @@ -209,6 +209,7 @@ class DocCog(commands.Cog): self.refresh_event.clear() log.debug("Refreshing documentation inventory...") self.inventory_scheduler.cancel_all() + self.inventory_reschedule_attempts.clear() # Clear the old base URLS and doc symbols to ensure # that we start from a fresh local dataset. @@ -216,7 +217,6 @@ class DocCog(commands.Cog): self.base_urls.clear() self.doc_symbols.clear() self.renamed_symbols.clear() - self.scheduled_inventories.clear() await self.item_fetcher.clear() # Run all coroutines concurrently - since each of them performs an HTTP |