perf: seed alert seen IDs in background on add

Reply immediately with empty seen, run a silent _poll_once in a
background task to populate seen IDs, then start the poller.
Eliminates the 30-120s blocking wait from 27 sequential backend queries.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
user
2026-02-17 10:45:25 +01:00
parent a123eba32a
commit f2199f2bec

View File

@@ -2054,19 +2054,6 @@ async def cmd_alert(bot, message):
await bot.reply(message, f"Alert limit reached ({_MAX_SUBS})") await bot.reply(message, f"Alert limit reached ({_MAX_SUBS})")
return return
# Seed: query all backends to populate seen lists (prevents flood)
loop = asyncio.get_running_loop()
seen: dict[str, list[str]] = {}
for tag, backend in _BACKENDS.items():
try:
items = await loop.run_in_executor(None, backend, keyword)
ids = [item["id"] for item in items]
if len(ids) > _MAX_SEEN:
ids = ids[-_MAX_SEEN:]
seen[tag] = ids
except Exception:
seen[tag] = []
now = datetime.now(timezone.utc).isoformat() now = datetime.now(timezone.utc).isoformat()
data = { data = {
"keyword": keyword, "keyword": keyword,
@@ -2077,16 +2064,21 @@ async def cmd_alert(bot, message):
"added_at": now, "added_at": now,
"last_poll": now, "last_poll": now,
"last_error": "", "last_error": "",
"seen": seen, "seen": {},
} }
_save(bot, key, data) _save(bot, key, data)
_subscriptions[key] = data _subscriptions[key] = data
_start_poller(bot, key)
counts = ", ".join(f"{len(seen.get(t, []))} {t}" for t in _BACKENDS) # Seed seen IDs in background (silent poll), then start the poller
async def _seed():
await _poll_once(bot, key, announce=False)
_start_poller(bot, key)
asyncio.create_task(_seed())
await bot.reply( await bot.reply(
message, message,
f"Alert '{name}' added for: {keyword} ({counts} existing)", f"Alert '{name}' added for: {keyword} (seeding in background)",
) )
return return