forked from lei.chen/myxce
fix(controller): bug-1433 async-thread fdatasync block + bug-1434 committed_lsn CAS race
bug-1433: raft_cb_become_leader runs synchronously off peer_ctrl_dispatch_to_pool, which hardcodes VTASK_LIVENESS for every inbound peer-control packet including vote replies. The bug-1431 round-2 fix (flusher_flush_once force-flush in persist_promotion_advance_committed) was reachable from that never-blocks task class -- same bug family as bug-1198. Removed the force-flush; round-3 (durable-capped only) plus the already-shipped bug-1432 immediate-first-heartbeat fix close the visibility-latency gap non-blockingly. TRACKED RESIDUAL: persist_apply_pump_run_sync is still reachable on the same VTASK_LIVENESS path and does bounded pread() -- lower risk (page-cache-hot) but strictly still blocking I/O; not safe to remove outright (reopens bug-1043-family job loss), needs its own follow-up (reclassify peer_ctrl_classify's winning-vote-reply case or dispatch promotion tail onto a fresh VTASK_LIVE_BLOCK vtask). bug-1434: persist_promotion_advance_committed and ha_standby_advance_committed_and_apply raced on persist_t.committed_lsn via an unlocked load-then-conditional-store during the promotion window (before ha->role flips to CTRL_PRIMARY) -- a losing racer could regress committed_lsn. Added persist_committed_lsn_advance_atomic (CAS retry loop, lock-free) and routed both call sites through it. Validated: 19/19 unit test suites, 6-round chaotic soak (0 loss/divergence) + 6-round sequential+leadership-coverage soak, both PASS. Also folds in raft-apply-decoupling and raft-ha-core-safety validate-impl phase bumps to "implemented" and clears config-upgrade-snapshot's now-satisfied entity-bearing-snapshots block.
This commit is contained in:
parent
ea0ac81c92
commit
40f510fb14
25 changed files with 1617 additions and 226 deletions
|
|
@ -227,6 +227,25 @@ typedef struct {
|
|||
* once per edge (no log storms across
|
||||
* repeated dispatch-gate rejections).
|
||||
* 0 at init (cleared by ha_init memset). */
|
||||
/* ── New field (2026-07-10, ha-convergence-recovery Req 1.4 supersession) ── */
|
||||
_Atomic int self_restart_pending; /* Set when ha_self_restart's execv()
|
||||
* fails (a demoted ex-primary could not
|
||||
* re-exec to discard provisional state).
|
||||
* Checked unconditionally, alongside
|
||||
* apply_divergent, by raft_cb_become_
|
||||
* leader and promotion_fence_timeout_fn
|
||||
* -- NEVER live-cleared (no clear site
|
||||
* exists anywhere): a periodic re-check
|
||||
* like promotion_fence_timeout_fn's
|
||||
* catch-up clear must NOT lift this, since
|
||||
* this node's WAL/durability state can
|
||||
* look perfectly healthy while its
|
||||
* in-memory state is still the stale
|
||||
* pre-demotion primary-era state the
|
||||
* restart exists to discard. Clears only
|
||||
* via a fresh process (a successful
|
||||
* retry replaces the image entirely).
|
||||
* 0 at init (cleared by ha_init memset). */
|
||||
/* ── New field added by ha-commit-durability spec (Task 4.4) ──────── */
|
||||
void * _Atomic promotion_fence_ctx; /* promotion_fence_ctx_t* for the
|
||||
* bounded-window catch-up timer (Req
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue