feat(config-upgrade-snapshot): gate primary serving and promotion on the activation fence
Wires task 6.1's upgrade_materialization_verify/upgrade_materialization_fenced into ha_dispatch_gate's CTRL_PRIMARY branch (sequential block alongside, not merged into, the existing config_serve_fenced check -- same replication/read-only opcode allowlist, refuses state-changing ops with -XCE_ERR_NOT_READY while fenced) and the promotion gate (raft_cb_become_leader refuses to become CTRL_PRIMARY while fenced, introduces no new WAL/log-completeness eligibility mechanism, never self-terminates). Adds a 4-function self-triggering retry trampoline (upgrade_materialization_retry_fn/_vtask_entry/_delaymgr_trampoline/ schedule_upgrade_materialization_retry) mirroring config_activate_retry_fn's exact shape, hooked into ha_cb_commit_advanced_stub alongside the existing config-byte retry. Fixes a real bug caught on review: the fence had no production path that could ever engage it from its zero-initialized default -- every setter call site was gated on the fence already being set (closed loop), making the new gate checks permanently dead code. Fixed with two unconditional upgrade_materialization_verify() call sites: persist.c's apply_committed_entry WAL_CONFIG_MARKER case (right after persist_checkpoint_marker_triggered returns, regardless of its rc) and myapp.c's boot sequence (right after config_activate_committed, for Req 5.2 crash/restart resume). New test drives the fence through the real production trigger (a forced -EBUSY checkpoint miss on a real marker commit+apply), not a direct verify() call, proving the end-to-end path actually works. Task 6.2 of 19. Requirements: 3.1, 3.2, 3.3, 3.4, 4.3, 5.5
This commit is contained in:
parent
7b507156a0
commit
89b85e1680
6 changed files with 805 additions and 7 deletions
|
|
@ -828,6 +828,37 @@ int upgrade_materialization_verify(cluster_t *c);
|
|||
*/
|
||||
int upgrade_materialization_fenced(const cluster_t *c);
|
||||
|
||||
/*
|
||||
* upgrade_materialization_retry_fn (config-upgrade-snapshot task 6.2, Req
|
||||
* 3.4, 5.5): re-runs upgrade_materialization_verify so a member whose
|
||||
* materialization was incomplete or hash-mismatched re-checks and clears the
|
||||
* fence once conditions allow. Does the actual blocking disk I/O; production
|
||||
* callers invoke it off the delaymgr thread via
|
||||
* schedule_upgrade_materialization_retry's trampoline (below) — mirrors
|
||||
* config_activate_retry_fn (config_repl.h). Public so tests can drive it
|
||||
* directly without a vtask pool. `arg` is a `cluster_t *`. Returns 0 on
|
||||
* success/already-unfenced, -EAGAIN while still fenced, negative errno on a
|
||||
* genuine error.
|
||||
*/
|
||||
int upgrade_materialization_retry_fn(void *arg);
|
||||
|
||||
/*
|
||||
* schedule_upgrade_materialization_retry (config-upgrade-snapshot task 6.2,
|
||||
* Req 3.4, 5.5): non-blocking, self-triggering retry for the Activation
|
||||
* Fence — mirrors config_schedule_activate_retry's exact delaymgr-
|
||||
* trampoline-then-vtask shape (config_repl.c:409-507): a one-shot delaymgr
|
||||
* task (NON-BLOCKING — only enqueues) offloads the actual blocking re-verify
|
||||
* work (upgrade_materialization_verify's disk reads) onto a VTASK_LIVE_BLOCK
|
||||
* vtask so the delaymgr thread itself never blocks (ha-async-io.md
|
||||
* thread-role contract). No-op when the member is NOT upgrade-materialization
|
||||
* fenced (steady state schedules nothing — no busy-spin) or when the
|
||||
* delaymgr is not running (unit-test fixture path; caller drives the retry
|
||||
* directly instead). Falls back to running the verify inline (stay alive,
|
||||
* never silently drop a scheduled retry) if the vtask pool is unavailable.
|
||||
* Returns 0 on enqueue/no-op, negative on enqueue failure.
|
||||
*/
|
||||
int schedule_upgrade_materialization_retry(cluster_t *c);
|
||||
|
||||
/*
|
||||
* ha_apply_wal_catchup_entry: apply a single WAL catch-up entry to local
|
||||
* persistent storage and advance ha->applied_lsn on success.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue