After 5.5 let the freshest survivor win PreVote and ENTER the real election, round 4 still stalled: the dead primary's control fd keeps RDHUP'ing on a deterministic ~15s cadence, and ha_on_primary_ctrl_fd_rdhup's 5.2 suppress only catches CTRL_STANDBY — so an ELECTING node fell through to ha_begin_failover and restarted a fresh PreVote, preempting its own in-progress real election. Every cycle bumped the term (21->25->28->29...) and kept two survivors dueling in lockstep, defeating the jittered election-timeout tiebreak. Guard the RDHUP entry: if role==CTRL_ELECTING or a PreVote round is in progress, close the dead control fd and return WITHOUT restarting failover — let the in-progress round finish or time out (its election timeout is jittered, which desynchronizes the duel so one survivor wins). A node not currently electing still takes the normal 5.2-suppress / genuine-loss failover path. RED+PIN in test_ha_core_safety.c (22 Tests / 0 Failures): CORE RED — CTRL_ELECTING + RDHUP must not start a new PreVote (Expected 0 Was 1 on baseline); PIN — genuine loss (STANDBY, not electing) still fails over. Preserves Election Safety, 5.2 suppression, and genuine-loss liveness. Re-running 7.2. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019dbTHR9CsEYK9RsqmQpQpC |
||
|---|---|---|
| .. | ||
| autoscaler | ||
| controller | ||
| docs | ||
| frontend | ||
| include | ||
| lib | ||
| nixSupport | ||
| scheduler | ||
| schema | ||
| tools | ||
| worker | ||
| flake.lock | ||
| flake.nix | ||
| meson.build | ||
| meson.options | ||