diff options
| author | 2021-01-14 05:17:07 +0100 | |
|---|---|---|
| committer | 2021-01-14 05:17:07 +0100 | |
| commit | b1250515e7d6d3545bcfd850c6286c69239cb420 (patch) | |
| tree | c936a22457ac2c14affe286c57179bf19df905e6 | |
| parent | Raise an error or log a warning if there's a global name conflict (diff) | |
Prevent an inventory refresh while waiting for item cache
If an inventory refresh was started while the symbol embed coroutine
was suspended, it could cause the parser to try to fetch a non existent
future if the markdown was requested after it was cleared but before
new inventories were loaded in.
| -rw-r--r-- | bot/exts/info/doc/_cog.py | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/bot/exts/info/doc/_cog.py b/bot/exts/info/doc/_cog.py index 942d685af..7b9dad135 100644 --- a/bot/exts/info/doc/_cog.py +++ b/bot/exts/info/doc/_cog.py @@ -70,6 +70,9 @@ class DocCog(commands.Cog): self.refresh_event = asyncio.Event() self.refresh_event.set() + self.symbol_get_event = asyncio.Event() + self.symbol_get_event.set() + self.init_refresh_task = self.bot.loop.create_task(self.init_refresh_inventory()) @lock("doc", COMMAND_LOCK_SINGLETON, raise_error=True) @@ -206,6 +209,7 @@ class DocCog(commands.Cog): async def refresh_inventory(self) -> None: """Refresh internal documentation inventory.""" self.refresh_event.clear() + await self.symbol_get_event.wait() log.debug("Refreshing documentation inventory...") self.inventory_scheduler.cancel_all() self.inventory_reschedule_attempts.clear() @@ -248,7 +252,10 @@ class DocCog(commands.Cog): return None self.bot.stats.incr(f"doc_fetches.{symbol_info.package}") + self.symbol_get_event.clear() markdown = await doc_cache.get(symbol_info) + self.symbol_get_event.set() + if markdown is None: log.debug(f"Redis cache miss for symbol `{symbol}`.") markdown = await self.item_fetcher.get_markdown(symbol_info) |