mirror of
https://github.com/ChuckBuilds/LEDMatrix.git
synced 2026-10-10 17:16:36 +00:00
web_interface/cache.py becomes a small TTLCache class (lock-guarded, monotonic clock) with the existing get_cached/set_cached/delete_cached/ invalidate_cache helpers kept on top of a shared instance, so the api_v3 callers are unchanged. Bugs fixed: - set_cached(ttl_seconds=...) ignored its TTL; only the reader's value counted and get_cached defaulted to 60s. An entry now expires after the TTL it was stored with; a reader's ttl_seconds can only shorten that. Both current callers pass the same value on both sides (fonts_catalog 300s, system_status 10s), so their observable TTLs are unchanged. - get_cached deleted expired keys without a lock; two threads reading the same expired key could raise KeyError (reproduced), which the endpoints turned into a 500. app.py's two hand-rolled systemctl caches (_ap_mode_cache, 30s, and _ledmatrix_service_cache, 15s) now share one helper over a private TTLCache, with the same TTLs. The AP-mode check used to retry on every request after a failure (and log an ERROR each time); a failure now keeps the last known answer for the TTL, as the display-service check already did. With no systemctl at all (a dev machine) it answers False without forking. Left alone as not TTL memoisation: the gzip cache (size-bounded, keyed by URL and version), the settings search index (keyed by installed-plugin set), the widget bundle (keyed by file fingerprint) and CacheManager (cross-process). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>