feat(election-iomgr-refactor): implement ha_start_election_async — task 2.4
Non-blocking election initiator that returns immediately after registering vote endpoints with iomgr and scheduling the election timeout watchdog. - Single-node shortcircuit (n_peers==1): allocates self-only ha_elect_ctx_t, calls ha_elect_evaluate_and_signal directly, frees ctx inline — no iomgr or delaymgr involvement; returns in < 1ms - Multi-node: allocates ha_elect_ctx_t, per-peer vote_ep_ctx_t, calls endpoint_connect + iomgr_monitor for each peer; schedules election timeout via delay_task_ms; skips peer on connect failure (counted as denied) - election_timeout_fn: delaymgr callback that fires ha_elect_evaluate_and_signal after election_timeout_ms, unless cancelled flag is set (lock-free cancellation) - vote_ep_err_handler: counts unreachable peers as denied votes - Declares ha_start_election_async in ha.h with full doc comment - 5 Unity tests in test_ha_start_election_async.c: returns < 5ms, stores n_peers, shortcircuit fires immediately, n_peers stored for multi-peer, term incremented — all GREEN with ASAN enabled
This commit is contained in:
parent
bd58e5045a
commit
e50afd02f6
5 changed files with 479 additions and 0 deletions
|
|
@ -442,6 +442,31 @@ void ha_on_heartbeat_received(ha_state_t *ha);
|
|||
/* ha_disarm_heartbeat_timeout_vtask: stop the heartbeat watchdog thread. */
|
||||
void ha_disarm_heartbeat_timeout_vtask(ha_state_t *ha);
|
||||
|
||||
/* ── Task 2.4: Non-blocking async election initiator ────────────────────── */
|
||||
|
||||
/*
|
||||
* ha_start_election_async: initiate a quorum election without blocking.
|
||||
*
|
||||
* Steps:
|
||||
* 1. Store n_peers in ha->n_peers.
|
||||
* 2. For single-node (n_peers == 1): call ha_elect_evaluate_and_signal directly
|
||||
* with a self-only ha_elect_ctx_t — shortcircuit, no iomgr/delaymgr needed.
|
||||
* 3. For multi-node: for each peer in peers[], allocate vote_ep_ctx_t, init
|
||||
* endpoint with client_ssl_ctx, set on_vote_connected + vote_ep_err_handler,
|
||||
* call endpoint_connect + iomgr_monitor; skip peer on connect failure.
|
||||
* Allocate election_timeout_ctx_t (cancelled=0) and schedule
|
||||
* delay_task_ms(delaymgr, election_timeout_ms, 1, election_timeout_fn, ctx).
|
||||
* 4. Returns immediately; election result delivered via ha_elect_evaluate_and_signal.
|
||||
*
|
||||
* Observable: returns in < 5ms; endpoints registered in iomgr; watchdog in delaymgr.
|
||||
* Requirements: 1.3 (non-blocking), 2.1 (single-node shortcircuit), 2.4 (async vote)
|
||||
* Boundary: ha.c (election orchestration)
|
||||
*/
|
||||
void ha_start_election_async(ha_state_t *ha, cluster_t *c,
|
||||
int n_peers, xce_candidate_t **peers,
|
||||
uint64_t my_config_tag, uint64_t my_lsn,
|
||||
const char *my_name);
|
||||
|
||||
/* ── Task 9.2: Persistent Control Channel (Req 6.1) ───────────────────────── */
|
||||
|
||||
/*
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue