feat(ha-config-bootstrap): implement vote handlers and term persistence (task 4.2)
- ha_persist_term(): atomic write+rename of ha_term_file_t with CRC32 - handle_request_vote(): term/voted_for/freshness/catch-up gate chain - handle_request_vote_reply(): vote counting, quorum+all-replied signaling - ha_elect_evaluate_and_signal(): quorum+yield+zero-config gates (4.3 early) - am_i_primary_quorum(): single-node shortcircuit + 2-round retry (4.3 partial) - 24 Tests 0 Failures in test_ha_election suite
This commit is contained in:
parent
403dd17f8b
commit
0f88d5d32a
4 changed files with 538 additions and 1 deletions
|
|
@ -294,9 +294,73 @@ int ha_dispatch_gate(ha_state_t *ha, int opcode);
|
|||
* ha_persist_term: write ha-term.bin atomically to {workdir}/ha-term.bin.
|
||||
* Uses write + rename for durability (existing pattern in the codebase).
|
||||
* Must be called before any vote is granted or term is incremented.
|
||||
* If workdir is NULL, the file write is skipped (safe for unit tests).
|
||||
*/
|
||||
void ha_persist_term(ha_state_t *ha, const char *workdir);
|
||||
|
||||
/*
|
||||
* handle_request_vote: process an incoming OP_requestVote RPC.
|
||||
* Applies term/voted_for/freshness gate; persists state via ha_persist_term().
|
||||
* Returns 1 = vote granted, 0 = vote denied, <0 = error.
|
||||
* Requirements: 2.2, 2.3, 2.4, 2.5, 2.6, 9.1
|
||||
*/
|
||||
int handle_request_vote(ha_state_t *ha,
|
||||
uint64_t term,
|
||||
const char *candidate_id,
|
||||
uint64_t config_tag,
|
||||
uint64_t last_lsn,
|
||||
uint64_t my_config_tag,
|
||||
uint64_t my_last_lsn,
|
||||
int in_catch_up_flag);
|
||||
|
||||
/*
|
||||
* ha_elect_evaluate_and_signal: evaluate accumulated ha_elect_ctx_t votes.
|
||||
* Sets ctx->result (1=primary, 0=standby) and posts ctx->done semaphore.
|
||||
* Applies quorum check, fresher-peer yield gate, and config_tag=0 fatal gate.
|
||||
* Requirements: 2.1, 2.7, 2.8
|
||||
*/
|
||||
ctrl_role_t ha_elect_evaluate_and_signal(ha_state_t *ha, ha_elect_ctx_t *ctx);
|
||||
|
||||
/*
|
||||
* am_i_primary_quorum: top-level Raft-style quorum election entrypoint.
|
||||
* Single-node: self-elects immediately (Req 2.9). Multi-node: spawns per-peer
|
||||
* vote-request threads, blocks on ctx->done, retries once on split vote (Req 2.10).
|
||||
* Returns CTRL_PRIMARY or CTRL_STANDBY.
|
||||
* Requirements: 2.1, 2.9, 2.10, 2.11
|
||||
*/
|
||||
ctrl_role_t am_i_primary_quorum(ha_state_t *ha,
|
||||
int n_peers,
|
||||
xce_candidate_t **peers,
|
||||
uint64_t my_config_tag,
|
||||
uint64_t my_lsn);
|
||||
|
||||
/*
|
||||
* handle_request_vote_reply: process an incoming reply to an OP_requestVote RPC.
|
||||
*
|
||||
* Called by each per-peer vote-request thread once the peer replies (or times out).
|
||||
* Updates the entry in ctx->votes[peer_idx] with the reply fields.
|
||||
* Increments ctx->votes_granted if vote_granted is non-zero.
|
||||
* Increments ctx->n_replied unconditionally.
|
||||
* Updates ctx->max_resp_tag / ctx->max_resp_lsn to track the freshest peer seen.
|
||||
* When quorum is reached (votes_granted >= quorum) OR all peers have replied
|
||||
* (n_replied >= n_peers), calls ha_elect_evaluate_and_signal() to post ctx->done.
|
||||
*
|
||||
* peer_idx: 0-based index into ctx->votes[] identifying the replying peer.
|
||||
* term: term the peer reported in its reply (used for fencing if > ha->term).
|
||||
* vote_granted: non-zero if the peer granted the vote, 0 if denied.
|
||||
* peer_config_tag: peer's current config_tag at reply time.
|
||||
* peer_lsn: peer's current WAL LSN at reply time.
|
||||
*
|
||||
* Requirements: 2.2, 2.3, 2.4, 2.5, 2.6, 9.1
|
||||
*/
|
||||
void handle_request_vote_reply(ha_state_t *ha,
|
||||
ha_elect_ctx_t *ctx,
|
||||
int peer_idx,
|
||||
uint64_t term,
|
||||
int vote_granted,
|
||||
uint64_t peer_config_tag,
|
||||
uint64_t peer_lsn);
|
||||
|
||||
/*
|
||||
* bootstrap_config_if_needed: pre-election config probe.
|
||||
* If the local config tag is 0 and at least one peer has config, sets
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue