feat(ha-repl-hardening): standby snapshot receive handler (task 3.5c)
ha_handle_snapshot_chunk writes chunks to snap.part, on isLast verifies
total_size, atomic renames to snap-{lsn}.bin, loads via new
persist_load_snapshot wrapper, sets applied_lsn=checkpoint_lsn.
3 tests: 2-chunk assembly, size mismatch, null args. Wired into
myreq_handler OPCode_snapshotTransfer dispatch.
This commit is contained in:
parent
318098c727
commit
cbd91fca43
7 changed files with 361 additions and 2 deletions
|
|
@ -361,6 +361,30 @@ void ha_process_standby_state(ha_state_t *ha, int peer_idx,
|
|||
uint64_t reported_tag, uint64_t reported_lsn,
|
||||
uint64_t committed_tag, uint64_t committed_lsn);
|
||||
|
||||
/* ── Task 3.5c: Standby snapshot receive handler ──────────────────────────── */
|
||||
|
||||
/*
|
||||
* ha_handle_snapshot_chunk: receive one snapshot transfer chunk on the standby.
|
||||
*
|
||||
* Each chunk's payload bytes are written (or appended) to snap.part in snap_dir.
|
||||
* When chunk->is_last is non-zero:
|
||||
* 1. Verify total bytes written == chunk->total_size.
|
||||
* 2. Atomically rename snap.part → snap-{snapshot_lsn:016x}.bin.
|
||||
* 3. Load the snapshot via persist_load_snapshot().
|
||||
* 4. Set ha->applied_lsn = p->checkpoint_lsn (in-memory only).
|
||||
*
|
||||
* On mid-transfer reconnect (caller resets state), snap.part is discarded.
|
||||
* Returns 0 on success, negative errno on error.
|
||||
*
|
||||
* Requirements: 4.2, 4.3, 4.4 (ha-repl-hardening spec)
|
||||
* Boundary: Standby Dispatch (cluster.c, ha.c)
|
||||
*/
|
||||
int ha_handle_snapshot_chunk(ha_state_t *ha, persist_t *p,
|
||||
const char *snap_dir,
|
||||
snapshot_transfer_t *chunk,
|
||||
const uint8_t *payload_bytes,
|
||||
size_t payload_len);
|
||||
|
||||
/* ── HA Config Bootstrap & Term Durability (ha-config-bootstrap spec) ── */
|
||||
|
||||
/*
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue