mirror of
https://github.com/ipnet-mesh/meshcore-hub.git
synced 2026-06-22 11:05:21 +02:00
38a57f4cd4
Three related performance fixes for slow (>500ms) API responses. 1. Stop blocking the event loop. Route handlers were declared `async def` but ran synchronous SQLAlchemy queries (and synchronous Redis calls via the cache decorator) directly on the event loop, serializing requests. Convert all handlers to sync `def` so FastAPI runs them in its threadpool, and make the `@cached` decorator dual-mode (sync wrapper for sync handlers, async wrapper preserved for a future async/Postgres path). 2. Tune SQLite for concurrency. Enable WAL, busy_timeout and synchronous=NORMAL on every connection, and size the pool above the threadpool so handlers don't wait on connections. In-memory SQLite is guarded (no overflow-pool kwargs). 3. Precompute an indexed `nodes.is_observer` flag. The `observer=true` filter scanned ~68k+ event rows to find a handful of observers (the advertisements page calls it with limit=500). Replace the 5-way OR of subqueries with `WHERE nodes.is_observer = ?`. The collector sets the flag on first observation (in add_event_observer); the cleanup job clears it once a node's events are all pruned; a migration adds the column/index and backfills from the existing union. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>