myxce/.wolf/bugs/bug-1485.md
2026-10-03 14:51:27 +00:00

3.6 KiB

id status status_updated status_note component severity timestamp last_seen occurrences files tags related fix_commits repro_attempts legacy
bug-1485 fixed 2026-10-03 xceadmin unknown 2026-07-30T14:35:00Z 2026-10-03T07:44:48Z 26
src/xceadmin/tests/test_e2e_live_ha_push.py (live_ha_cluster fixture); root cause is in src/controller (exact site not yet isolated -- C-side investigation out of this task's boundary)
flaky-test
ha
raft-election
controller-crash
admin-config-tool
task-6.3
e2e-live
unresolved
pytest-specific
bug-1477
bug-1479
bug-606
362098b1
0/40 repro attempts (2026-08-01) true

bug-1485: test_e2e_live_ha_push.py::test_live_config_push_against_primary_reaches_success_path flaky…

Description

test_e2e_live_ha_push.py::test_live_config_push_against_primary_reaches_success_path flaky (near-100% fail rate across ~25 live runs during admin-config-tool task 6.3 round-2 remediation): TimeoutError: controller never opened localhost:: [Errno 111] Connection refused, raised from a fresh wait_for_port re-probe of the elected primary's own address performed AFTER _wait_for_primary (CTRL_PRIMARY marker) + a new _wait_for_standbys (both other nodes show CTRL_STANDBY) + a 3s settle sleep all already succeeded.

Environment

Not recorded (migrated from buglog.json).

Reproduction

  • Attempts: 0/40 repro attempts (2026-08-01)

Root cause

Corrected 2026-10-03, superseding the earlier zombie-primary / CPU-starvation hypotheses (kept in git history; the zombie symptom was never reproduced). The 2026-10-03 symptom version_tag == 0 is an error reply, not a bad success: push.py maps any non-zero status to versionTag=0 ackedCount=0, and the controller rejected the push with -110 (config_repl.c ~1839-1845, repl_wait_majority_ack 500 ms). It happens after a "late-joiner" election: the own-term no-op (lsn 1) is appended before any standby is registered (ha.c ~5178, repl.c ~306-311), the standbys register later via on_standby_connected (ha.c ~9643-9660) without the no-op being resent, and heartbeat-driven catch-up commits it only ~6 s (two 3 s cycles) after the election. A push in that window is NACKed by both standbys and times out. The fixture's readiness check (role markers + 3 s settle) did not cover that window. The controller behaviour itself (fail-loud rejection) is correct; its ~6 s write-unavailability is tracked as bug-1913.

Fix

Test-side (src/xceadmin/tests): new wait_for_primary_write_ready() / primary_write_ready() in _live_e2e_common.py wait until a commit logged after the latest "own-term noop appended lsn=N" reaches N; the live_ha_cluster fixture calls it (30 s) after waiting for standbys; versionTag assertions now print the CLI's stdout/stderr. Fix commit 362098b1.

Verification

  • Test: test_live_config_push_against_primary_reaches_success_path in src/xceadmin/tests/test_e2e_live_ha_push.py — RED before under CPU load (40 busy loops): 7/28 runs failed with expected a non-zero versionTag, got 0 (... stderr='Error: controller returned status -110'), all late-joiner elections; GREEN after: 95 looped runs incl. 24 under the same load (7 late-joiner elections, all passed). Helper unit tests in test_live_e2e_common.py (no-op not committed → not ready; latest no-op only; commits before the latest no-op ignored).
  • Suites: xceadmin 373 passed, 2026-10-03.
  • Live: residual, different mechanism: under heavy oversubscription a normally-elected primary can miss the 500 ms marker barrier (1/70 HA loops).

References

  • Related: bug-1477, bug-1479, bug-606