aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Numerlor <[email protected]>2021-01-14 05:17:07 +0100
committerGravatar Numerlor <[email protected]>2021-01-14 05:17:07 +0100
commitb1250515e7d6d3545bcfd850c6286c69239cb420 (patch)
treec936a22457ac2c14affe286c57179bf19df905e6
parentRaise 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.py7
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)