feat(dashboard): alarms page consumes snapshot_status feed frame for the truncation banner
The truncated-snapshot caveat moved from poll-only to push-driven. The page already held an in-process alarm-feed subscription for the provider badge; it now also handles the feed's snapshot_status frame, so a capped provider fetch is caveated when the monitor decides it rather than up to three seconds later. The poll's assignment stays as the reconcile baseline — both sources read the same monitor verdict, and the frame is consumed, never synthesized page-side. StreamAsync primes every subscriber with a snapshot_status frame at open, so a page attaching mid-truncation needs no priming logic of its own; the loop is renamed StatusFeedLoopAsync because it now feeds two indicators, not one.
This commit is contained in:
@@ -245,8 +245,9 @@ cancelling, a detach-driven exit leaves the pill to the incoming subscription; w
|
||||
the pill therefore reports is the case it exists for — the channel completing under
|
||||
a page that is still watching.
|
||||
|
||||
`AlarmsPage` owns two loops of its own (the 3 s alarm poll and the provider-status
|
||||
badge) and bounds their drain at 5 seconds on dispose, for the same reason
|
||||
`AlarmsPage` owns two loops of its own (the 3 s alarm poll and the status feed that
|
||||
drives the provider badge and the truncated-snapshot banner) and bounds their drain
|
||||
at 5 seconds on dispose, for the same reason
|
||||
`DashboardPageBase` bounds its watch drain: both loops render through the renderer's
|
||||
dispatcher, and disposal can run on it. The two are drained concurrently, so the
|
||||
bound on disposal is 5 seconds in total rather than per loop — a wedged dispatcher
|
||||
@@ -285,11 +286,18 @@ Both seams consume the same producing services, so they share these cadences:
|
||||
- alarm publisher emits on each transition observed by the central monitor;
|
||||
- event publisher emits per event fanned by the session's `SessionEventDistributor`
|
||||
to its internal dashboard-mirror subscriber (independent of any gRPC `StreamEvents`);
|
||||
- the alarms page's provider-status badge resubscribes one second after its
|
||||
- the alarms page's status feed resubscribes one second after its
|
||||
`IGatewayAlarmService.StreamAsync` enumeration ends — the monitor completes a
|
||||
subscriber's stream when it falls behind and again when it restarts, both
|
||||
recoverable by resubscribing — and holds its last value in between. The page's
|
||||
alarm rows are independent of that stream and refresh on the 3 s poll.
|
||||
recoverable by resubscribing — and the badge and banner hold their last values in
|
||||
between. That feed carries both gateway-status frames: `provider_status` drives the
|
||||
badge, and `snapshot_status` drives the truncated-snapshot banner, so the caveat
|
||||
appears on the monitor's verdict change rather than up to three seconds later. Every
|
||||
subscriber is primed with a `snapshot_status` frame at open, so a page attaching
|
||||
mid-truncation needs no priming logic of its own. The page's alarm rows are
|
||||
independent of that stream and refresh on the 3 s poll, which also re-asserts the
|
||||
truncation verdict as its reconcile baseline — both sources read the same monitor
|
||||
verdict, and neither is synthesized page-side.
|
||||
|
||||
### Idle gating and snapshot cost
|
||||
|
||||
@@ -540,8 +548,11 @@ alarm-history store, so the page reflects only the live active set. The page is
|
||||
read-only; it does not acknowledge alarms. A provider-status badge tracks the
|
||||
central monitor's health from `IGatewayAlarmService.StreamAsync` in process — the
|
||||
alarm service is already a multi-subscriber fan-out, so the badge needs no SignalR
|
||||
client, no loopback socket, and no hub token — while the alarm rows themselves
|
||||
still come from the three-second poll. If `MxGateway:Alarms:Enabled` is
|
||||
client, no loopback socket, and no hub token — and the same subscription carries the
|
||||
`snapshot_status` frame behind the truncated-snapshot banner ("Alarm snapshot may be
|
||||
incomplete"), so a capped provider fetch is caveated the moment the monitor decides
|
||||
it. The alarm rows themselves still come from the three-second poll, which also
|
||||
re-asserts the truncation verdict as the reconcile baseline. If `MxGateway:Alarms:Enabled` is
|
||||
false the central monitor never starts, and the page says so instead of showing
|
||||
an empty list with no explanation.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user