feat(ha-term-safety): wire five callbacks + library init restore (task 2.5)
This commit is contained in:
parent
3470bdfb71
commit
3dd8493fff
3 changed files with 139 additions and 3 deletions
|
|
@ -4450,6 +4450,32 @@ void ha_init_raft(ha_state_t *ha, cluster_t *c, int n_peers)
|
|||
}
|
||||
}
|
||||
|
||||
/* ha-term-safety task 2.5 (R1.5, R2.1): restore the durable log/commit floor
|
||||
* from the recovered WAL so the library boots at the recovered tip — not an
|
||||
* empty log at LSN 0. The library never reads storage; the caller restores
|
||||
* initial_log_len / initial_commit_index here (same discipline as
|
||||
* initial_term / initial_voted_for above).
|
||||
*
|
||||
* initial_log_len = recovered durable last-log index
|
||||
* (persist_durable_floor: re-derived from the WAL tip
|
||||
* by persist_recover; 0 on empty first boot).
|
||||
* initial_commit_index = recovered committed LSN (committed_lsn). Recovery
|
||||
* re-derives the durable tip but the post-election
|
||||
* safe-commit point governs the committed position;
|
||||
* we pass whatever committed prefix is established at
|
||||
* init (0 on a fresh boot). Clamp to log_len to honor
|
||||
* the library invariant commit_index <= log_len.
|
||||
*
|
||||
* The recovered last-log TERM is surfaced on demand via on_get_entry_term(
|
||||
* log_len) (the library's logOk freshness gate reads it) — there is no
|
||||
* separate initial last-log-term field. */
|
||||
uint64_t initial_log_len = c ? persist_durable_floor(&c->persist) : 0;
|
||||
uint64_t initial_commit_index = c
|
||||
? atomic_load_explicit(&c->persist.committed_lsn, memory_order_acquire)
|
||||
: 0;
|
||||
if (initial_commit_index > initial_log_len)
|
||||
initial_commit_index = initial_log_len;
|
||||
|
||||
raft_config_t rcfg;
|
||||
memset(&rcfg, 0, sizeof(rcfg));
|
||||
rcfg.n_peers = n_peers;
|
||||
|
|
@ -4458,15 +4484,19 @@ void ha_init_raft(ha_state_t *ha, cluster_t *c, int n_peers)
|
|||
rcfg.my_priority = ha->my_priority;
|
||||
rcfg.initial_term = atomic_load_explicit(&ha->term, memory_order_acquire);
|
||||
rcfg.initial_voted_for = restored_voted_for;
|
||||
rcfg.initial_log_len = initial_log_len;
|
||||
rcfg.initial_commit_index = initial_commit_index;
|
||||
rcfg.cbs = &s_real_cbs;
|
||||
rcfg.ctx = ha;
|
||||
raft_init(&ha->raft, &rcfg);
|
||||
|
||||
ha->n_peers = n_peers;
|
||||
ha->raft_c = c;
|
||||
INFO("HA: raft initialized (n_peers=%d, self=%d, term=%" PRIu64 ")",
|
||||
INFO("HA: raft initialized (n_peers=%d, self=%d, term=%" PRIu64
|
||||
", log_len=%" PRIu64 ", commit_index=%" PRIu64 ")",
|
||||
n_peers, ha->my_priority,
|
||||
atomic_load_explicit(&ha->term, memory_order_acquire));
|
||||
atomic_load_explicit(&ha->term, memory_order_acquire),
|
||||
initial_log_len, initial_commit_index);
|
||||
}
|
||||
|
||||
/* ── ha-prevote task 4.1: candidate-side PreVote orchestration ─────────────
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue