Commit Graph

8 Commits

Author SHA1 Message Date
b1f81eff0f Revert "perf: split into fast poll + slow-cached library fetches"
All checks were successful
Build and Push Docker Image / build (push) Successful in 24s
This reverts commit 78a8737f29.
2026-05-16 00:21:46 +01:00
78a8737f29 perf: split into fast poll + slow-cached library fetches
All checks were successful
Build and Push Docker Image / build (push) Successful in 24s
Fast poll (every cycle): SABnzbd, Sonarr/Radarr queue + history,
qBittorrent — all lightweight with no include* params.

Slow cache (5 min TTL): Sonarr series, Radarr movies, tags —
fetched only when cache expires. These rarely change.

This eliminates the 2s+ includeSeries/includeMovie joins from
every poll cycle. First poll is still slow (cold cache), but
subsequent polls should complete in <500ms.
2026-05-16 00:20:11 +01:00
d5542abd27 perf: drop includeSeries/includeMovie from history fetches
All checks were successful
Build and Push Docker Image / build (push) Successful in 23s
Sonarr/Radarr history with include* params forces expensive DB
joins (~2s each). History records still have seriesId/movieId
for matching; the series/movie objects come from the queue-built
maps instead.

Trade-off: completed downloads only show if the series/movie
is also currently in the queue. Active downloads unaffected.
2026-05-16 00:16:31 +01:00
980e20247c perf: reduce history page sizes and drop includeEpisode
All checks were successful
Build and Push Docker Image / build (push) Successful in 22s
- Sonarr/Radarr history: pageSize 20 -> 10
- SABnzbd history: limit 20 -> 10
- Drop includeEpisode from Sonarr queue and history (never rendered)
- These reduce DB join overhead and response payload size
2026-05-16 00:14:12 +01:00
b44d370b51 perf: eliminate full Sonarr Series + Radarr Movies library fetches
All checks were successful
Build and Push Docker Image / build (push) Successful in 40s
The poller was fetching the entire series and movie libraries on every
poll cycle (~9s each). Queue and history records already embed the full
series/movie object via includeSeries/includeMovie params.

Changes:
- Remove 'Sonarr Series' and 'Radarr Movies' timed fetches from poller
- Tag queue/history records with _instanceUrl in the poller instead
- Build seriesMap/moviesMap from embedded objects in dashboard
- Remove poll:sonarr-series and poll:radarr-movies cache keys
- Fix missing axios and config imports in dashboard
- Net result: ~18s saved per poll cycle, ~2 fewer API calls
2026-05-16 00:05:14 +01:00
5ae6af114e feat: live-updating status panel with per-task poll timings
All checks were successful
Build and Push Docker Image / build (push) Successful in 28s
- Each service fetch is individually timed (SABnzbd, Sonarr, Radarr, qBit)
- Status panel shows timing bar chart with ms per task and total
- Shows 'Last Poll' age that updates live
- Shows client refresh rate (1s/5s/10s/Off)
- Status panel auto-refreshes in sync with dashboard refresh cycle
- Changing refresh rate restarts the status panel refresh too
- TTL counters update live on each refresh
2026-05-15 23:58:10 +01:00
6d6969190a feat: make background polling disablable with on-demand fallback
All checks were successful
Build and Push Docker Image / build (push) Successful in 27s
- Set POLL_INTERVAL=0, off, false, or disabled to disable background polling
- When disabled, data is fetched on-demand when a user opens the dashboard
- On-demand results cached for 30s so other users benefit from fresh data
- A user with a faster refresh rate keeps the cache warm for everyone
- When polling is enabled, behaviour is unchanged (default 5s)
2026-05-15 23:46:51 +01:00
fe73589633 perf: background poller for near-instant dashboard responses
All checks were successful
Build and Push Docker Image / build (push) Successful in 28s
- New poller.js polls all services on a configurable interval
- POLL_INTERVAL env var (default 5000ms / 5 seconds)
- All data stored in cache with TTL of 3x poll interval
- Dashboard endpoint now reads from cache only (no network calls)
- API responses are near-instant regardless of service count
- First poll runs immediately on server start
2026-05-15 23:42:38 +01:00