feat: monitor heartbeat + background poller skips active-monitored units
- Heartbeat: if nothing has been broadcast in MONITOR_HEARTBEAT_S (default 25s) — e.g. device offline and silent — send a non-cached keepalive frame so a reverse proxy (NPM) doesn't drop the idle WS. New subscribers still get the last real frame, not a heartbeat. - Poller-skip: the 60s background poller now skips any unit with a running monitor (MonitorManager.is_active). The monitor already polls it ~1Hz and keeps the status cache fresh, so the background poll was redundant and just added load/lock-contention on the device's single connection (and churn, which matters for the cellular wedge). Trade-off: the FTP start-time sync (only in the poller) doesn't run while a unit is actively monitored — fine, since reports take the authoritative start time from the FTP .rnd data. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -178,10 +178,19 @@ class BackgroundPoller:
|
||||
now = datetime.utcnow()
|
||||
polled_count = 0
|
||||
|
||||
from app.monitor import monitor_manager
|
||||
|
||||
for cfg in configs:
|
||||
if not self._running:
|
||||
break
|
||||
|
||||
# Skip units with an active live monitor: it polls them at ~1Hz and
|
||||
# keeps the status cache fresh, so a redundant background poll would just
|
||||
# add load/lock-contention on the device's single connection.
|
||||
if monitor_manager.is_active(cfg.unit_id):
|
||||
self._logger.debug(f"Skipping {cfg.unit_id} — live monitor active")
|
||||
continue
|
||||
|
||||
# Get current status
|
||||
status = db.query(NL43Status).filter_by(unit_id=cfg.unit_id).first()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user