fix(runtime): pin the Primary-verdict member-event subscription with a test; document the pre-join allow window (review R6 MINOR-2/3)
MINOR-3: new DriverHostActorPrimaryRoleSourceTests case drives the deny flip with a real ClusterEvent.MemberUp on the EventStream (how the cluster's domain-event publisher reaches a Cluster.Subscribe subscriber) instead of a direct RepublishPrimaryVerdict tell; it fails when the Cluster.Subscribe(IMemberEvent) call is deleted. MINOR-2: the published verdict MIRRORS the live gate; before this node has joined its member count is 0 and both allow (seconds; up to the bootstrap guard's 25 s probe), so the Sparkplug primary-host claim can be held on both nodes in that window (native ack is unaffected - view and route agree). Behaviour deliberately unchanged: denying until self is Up would change the live gate too and delay writes/acks on a single-node cluster's own join. Comments + AlarmTracking.md / Redundancy.md / Mqtt.md corrected. Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
This commit is contained in:
@@ -363,9 +363,14 @@ Hence: bind the claim to a connection, and rebuild the connection on role change
|
||||
| Role unknown, no driver peer (single node) | open | `ONLINE` |
|
||||
|
||||
The verdict comes from `PrimaryGatePolicy.ShouldServiceAsPrimary` via `IDriverPrimaryRoleSource`
|
||||
(`Core.Abstractions`), published by `DriverHostActor` on every redundancy snapshot and **sampled on a
|
||||
1-second timer** rather than evented — a process-singleton raising events at per-instance drivers
|
||||
outlives every driver it holds a reference to.
|
||||
(`Core.Abstractions`), published by `DriverHostActor` at host start, on every cluster membership change and on
|
||||
every redundancy snapshot, and **sampled on a 1-second timer** rather than evented — a process-singleton
|
||||
raising events at per-instance drivers outlives every driver it holds a reference to.
|
||||
|
||||
> ⚠️ **"Driver peer present" is this node's own cluster view.** Before the node has joined, it sees no
|
||||
> members, which is the single-node row: a node cold-starting into a pair whose peer is already Primary
|
||||
> can open the claim until its join completes (seconds; up to the bootstrap guard's 25 s partner probe),
|
||||
> so both nodes may briefly hold it (review R6 MINOR-2).
|
||||
|
||||
> **Accepted trade: a brief edge-visible `OFFLINE` during failover**, while the old Primary stands down
|
||||
> and the new one connects and republishes. That is a genuine state transition — for that window there
|
||||
|
||||
Reference in New Issue
Block a user