docs(controller): NOTICE — config upgrade must snapshot state, not re-derive
Add an in-situ NOTICE at the config-upgrade restart site (do_upgrade_config_with_bytes, step 9). Today an upgrade commits the config-change marker, then each member restarts and re-materializes its post-upgrade state by replaying its own pre-upgrade WAL under the NEW config; replay is config-dependent (lost_and_found re-homes orphaned entities), so members can diverge in materialized state (bug-857). The notice records the intended fix — materialize a full entity-bearing snapshot at the marker's (term,lsn) boundary, embed the new config, and install the SAME snapshot on every member via snapshot_transfer_s — and its hard dependency on entity-bearing-snapshots. Comment-only; anchors to .kiro/specs/config-upgrade-snapshot/. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MSxwb2Xt5F84ATgiAZnH8V
This commit is contained in:
parent
8da8fd03dd
commit
50b976aedc
1 changed files with 16 additions and 0 deletions
|
|
@ -1638,6 +1638,22 @@ static int do_upgrade_config_with_bytes(cluster_t *c, endpoint_t *ep,
|
|||
reply.data.upgradeconfigreplymsg = &urep;
|
||||
xce_reply(ep, c->myhost, &reply);
|
||||
|
||||
/* NOTICE (bug-857, spec `.kiro/specs/config-upgrade-snapshot/`) — config
|
||||
* upgrade MUST snapshot current state, not re-derive it per node.
|
||||
* Today the upgrade commits the config-change marker, then each member
|
||||
* RESTARTS and re-materializes its post-upgrade state by replaying its own
|
||||
* pre-upgrade WAL under the NEW config (steps 9 + restart recovery). Replay
|
||||
* is config-dependent (`lost_and_found` re-homes entities whose config
|
||||
* entity vanished), so members can DIVERGE in materialized state after an
|
||||
* upgrade. The fix: at the config-change marker's (term,lsn) boundary the
|
||||
* controller must materialize a full ENTITY-BEARING state snapshot, embed
|
||||
* the new config in it, and install that SAME snapshot on every member via
|
||||
* the snapshot_transfer_s transport (install-before-activate, hash-verified)
|
||||
* so post-upgrade state is identical by construction and no member
|
||||
* re-derives it. HARD dependency: `entity-bearing-snapshots` (snapshots are
|
||||
* a 16-byte LSN sentinel today; the entity payload does not exist yet).
|
||||
* Until that lands, the per-node-replay path below is the interim behavior. */
|
||||
|
||||
/* 9. Wait for in-flight checkpoint (up to 30 s), then signal restart */
|
||||
struct timespec ckpt_start, ckpt_now;
|
||||
clock_gettime(CLOCK_MONOTONIC, &ckpt_start);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue