feat(raft-ha-core-safety): establish snapshot (term,lsn) boundary on install (task 3.2)
Adds checkpointTerm (@6, append-only) to the SnapshotTransfer wire message. The leader stamps it via persist_entry_term(p, checkpoint_lsn) when sending a snapshot; the standby reconciles it into its own per-LSN term index (persist_reconcile_checkpoint_term) right after persist_load_snapshot succeeds, before applied_lsn advances. This authoritatively overwrites any stale local term a divergent pre-snapshot entry left at the checkpoint LSN, closing the gap task 3.1's RED test proved (Expected 7 Was 3 -> now passes). Transport stays persist_t-free; the reconcile lives in persist.c per the existing dependency direction. Decode is auto-generated via capnp mapname; only the hand-rolled encode path (request.c/typemap.h, needed for the raw snapshot payload) required a matching manual update. test_ha_core_safety 25/0, test_config_repl 66/0, no ASAN reports.
This commit is contained in:
parent
21858faba4
commit
a53b9a7b6c
11 changed files with 132 additions and 23 deletions
|
|
@ -505,6 +505,29 @@ uint64_t persist_entry_term(const persist_t* p, uint64_t lsn)
|
|||
return result;
|
||||
}
|
||||
|
||||
/* persist_reconcile_checkpoint_term — raft-ha-core-safety task 3.2 (Req
|
||||
* 3.1/5.1), Snapshot Boundary Reconcile. See persist.h for the full contract.
|
||||
* Reuses record_entry_term (same translation unit) to authoritatively
|
||||
* overwrite whatever term (if any) the local term index held at
|
||||
* checkpoint_lsn — this is a genuine reconcile-overwrite, not an idempotent
|
||||
* skip, because a pre-snapshot divergent entry may have left a stale local
|
||||
* term at this exact LSN. Only the checkpoint LSN's own term is reconciled:
|
||||
* post-install Raft semantics mean no AppendEntries prevLogIndex/prevLogTerm
|
||||
* check against this member ever references an LSN below the checkpoint
|
||||
* again (the checkpoint is the new log-start boundary), and the WAL bytes
|
||||
* below it were compacted away, so there is no data to reconstruct a full
|
||||
* per-LSN history from even if it were needed. */
|
||||
void persist_reconcile_checkpoint_term(persist_t* p, uint64_t checkpoint_lsn,
|
||||
uint64_t checkpoint_term)
|
||||
{
|
||||
if (!p || checkpoint_lsn == 0)
|
||||
return;
|
||||
|
||||
pthread_mutex_lock(&p->lock);
|
||||
record_entry_term(p, checkpoint_lsn, checkpoint_term);
|
||||
pthread_mutex_unlock(&p->lock);
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------ */
|
||||
/* Public API */
|
||||
/* ------------------------------------------------------------------ */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue