forked from lei.chen/myxce
feat(ha-repl-hardening): unified replication decision loop (task 3.2)
ha_evaluate_repl_action() pure function: stale tag→PUSH_CONFIG, lsn<oldest_wal→SEND_SNAPSHOT, lsn<committed→STREAM_WAL, else CONVERGED. 5 tests. Fixed misleading stream_wal_from_zero test name per review.
This commit is contained in:
parent
aab41fa609
commit
a475ef621f
4 changed files with 176 additions and 1 deletions
|
|
@ -289,6 +289,53 @@ int ha_apply_wal_catchup_entry(ha_state_t *ha, persist_t *p,
|
|||
void ha_nop_reply_state_report(ha_state_t *ha, myconf_t *myconf,
|
||||
state_report_t *sr, xce_reply_t *reply_out);
|
||||
|
||||
/* ── Task 3.2: Unified replication decision enum and evaluator ────────────── */
|
||||
|
||||
/*
|
||||
* ha_repl_action_t: result of ha_evaluate_repl_action().
|
||||
*
|
||||
* Encodes the single replication action the primary should take for a standby
|
||||
* on the current heartbeat cycle, based solely on the standby's reported
|
||||
* (config_tag, applied_lsn) vs the primary's committed state.
|
||||
*
|
||||
* Decision tree (design §Unified Heartbeat-Driven Protocol):
|
||||
* standby_tag < committed_tag → PUSH_CONFIG
|
||||
* standby_lsn < oldest_wal_lsn → SEND_SNAPSHOT
|
||||
* standby_lsn < committed_lsn → STREAM_WAL
|
||||
* tag >= committed AND lsn >= committed → CONVERGED
|
||||
*
|
||||
* Requirements: 2.2, 2.3, 2.4 (ha-repl-hardening spec)
|
||||
*/
|
||||
typedef enum {
|
||||
HA_REPL_PUSH_CONFIG, /* standby config tag is behind — push config first */
|
||||
HA_REPL_SEND_SNAPSHOT, /* standby LSN predates oldest WAL — transfer snapshot */
|
||||
HA_REPL_STREAM_WAL, /* standby LSN is within WAL window — stream entries */
|
||||
HA_REPL_CONVERGED, /* standby tag and LSN are both current */
|
||||
} ha_repl_action_t;
|
||||
|
||||
/*
|
||||
* ha_evaluate_repl_action: pure decision function — no side effects.
|
||||
*
|
||||
* Evaluates the standby's reported (standby_tag, standby_lsn) against the
|
||||
* primary's committed state (committed_tag, committed_lsn, oldest_wal_lsn)
|
||||
* and returns the single action the primary should take this heartbeat cycle.
|
||||
*
|
||||
* Arguments:
|
||||
* standby_tag — config_tag last reported by this standby
|
||||
* standby_lsn — applied_lsn last reported by this standby
|
||||
* committed_tag — primary's committed config_tag
|
||||
* committed_lsn — primary's committed WAL LSN
|
||||
* oldest_wal_lsn — oldest retained WAL LSN (entries before this are gone)
|
||||
*
|
||||
* Requirements: 2.2, 2.3, 2.4 (ha-repl-hardening spec)
|
||||
* Boundary: Primary Heartbeat Handler (ha.c)
|
||||
*/
|
||||
ha_repl_action_t ha_evaluate_repl_action(uint64_t standby_tag,
|
||||
uint64_t standby_lsn,
|
||||
uint64_t committed_tag,
|
||||
uint64_t committed_lsn,
|
||||
uint64_t oldest_wal_lsn);
|
||||
|
||||
/*
|
||||
* ha_process_standby_state: update per-standby convergence tracking.
|
||||
*
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue