FleetStatusBroadcaster is blind to site nodes post-Phase-6 mesh split (fleet-wide gossip assumption) #542
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
FleetStatusBroadcasterderives "fleet" status from central's own Akka gossip ring. Since theper-cluster mesh split (Phase 6, 2026-07-24 — one independent 2-node Akka mesh per application
Clusterinstead of one fleet-wide mesh), central no longer shares gossip with the site meshesat all, so this component is silently blind to every site node: it can only ever see the central
pair it lives on.
Detail
This is pre-existing and transport-independent — it does not depend on
MeshTransport:Mode(
Dps/ClusterClient/Grpc) and is not introduced or worsened by the ClusterClient→gRPCmigration. It was surfaced during that migration's design pass as a code-verified finding, and is
filed here rather than folded into the migration because fixing it is a different kind of work
(giving
FleetStatusBroadcastera cross-mesh data source) than swapping the command-planetransport.
See
docs/plans/2026-08-06-clusterclient-to-grpc-design.md§3.8 ("Deliberately out of scope")for the code-verified writeup, and §4 finding 5 for the one-line cross-reference.
Suggested scope
Give
FleetStatusBroadcastera cross-mesh-aware source for site-node status — e.g. central'sexisting
ClusterNodeDB rows (already the source of truth Phase 1 gives the deploy-ack set andPhase 2 gives the ClusterClient/gRPC contact-point set) plus per-node health already flowing over
the Phase 5 telemetry stream, rather than reading the Akka gossip ring it happens to sit on.
Fixed by deletion, merged to
master@d01b717eand pushed (branchfix/issue-542-fleetstatus, commitsf1c18811+b5607d35).Why deletion rather than the suggested cross-mesh rewrite: scoping found the defect is wider than filed — the chain was dead end-to-end, not just blind:
FleetStatusBroadcasterpublishedFleetStatusChangedon DPS topicfleet-status→FleetStatusSignalRBridge→FleetStatusHub(/hubs/fleet-status) — and no client of that hub exists anywhere (the AdminUI deliberately opens no self-HubConnections;/fleetreadsNodeDeploymentState+IClusterRoleInfoon a 5 s poll and never referenced these types).DriverHostStatusHeartbeat, had no production sender (only its own test told it), soCurrentRevisionwas always null and the 30 s staleness→Degraded flip could never fire.Giving a zero-consumer pipeline a cross-mesh data source would have activated inert machinery — the same call this repo made in #522, #507 and #525: when the premise is gone, delete. The real, cross-mesh-correct fleet visibility already exists:
/fleet(deploy acks ride the gRPC mesh transport intoNodeDeploymentState) and the Phase 5 per-node telemetry dialers feeding/hosts.Deleted: broadcaster (+
DriverHostStatusHeartbeat), SignalR bridge, hub,FleetStatusChanged/FleetNodeStatus/FleetNodeHealth, registrations, tests. Kept: everything else under theFleetnamespaces (ClusterNodeAddressReconciler*,GetDiagnostics/IFleetDiagnosticsClient— live, unrelated). Docs swept (Telemetry.md, Configuration.md, CLAUDE.md; plans/v2 kept as history; the phase-6-1 compliance script's staleAssert-Deferredretired). Grep-gate: the only surviving mention in src/tests is the tombstone comment at the old registration site.Review chain: spec ✅ + code ✅ (one residue find swept in
b5607d35; the reviewer's "build-breaking CS0219" claim was disproven — the deadproxyOptionslocal predated this change on master and object-creation initializers don't raise CS0219, but the dead line was removed anyway). ControlPlane.Tests 231/0, AdminUI.Tests green, build warnings byte-identical to master baseline. Full suite on the merged SHA9420f8ef: exit 0, 50/50 suites, 9,333 passed / 0 failed.