diff options
| author | tv <tv@krebsco.de> | 2026-11-09 03:05:08 +0000 |
|---|---|---|
| committer | tv <tv@krebsco.de> | 2026-11-09 04:05:27 +0100 |
| commit | 3c1403409877b0006594324a0daa5e9dd55ec3f4 (patch) | |
| tree | 7fdd96893a01185259f369d84e3f5231a9de4995 /docs | |
| parent | c2e566599aed088973b5a5be2bb04ee69cee5c7a (diff) | |
remake: leave out earlier epochs' metadata past the replay window
Every snapshot carried the metadata of all earlier epochs (`_continuum/epochs`)
forward, so it grew by an entry, a clock per actor among it, with every remake. Only a
rejoining node reads an earlier entry: a node on epoch P reads P+1's (its clock, when
it was proposed, its replay window) and every one up to the swarm's epoch (kind,
translation, whether it was strict). It replays only while P+1's replay window covers
it; beyond, its writes are quarantined whatever the entries say.
So a snapshot now leaves out the generations older than the oldest whose replay window
still covers a node on the epoch before it (`snapshot::left_out`), judged by the
remake's `proposedAt`: the same on every node, and earlier than any rejoining node's
clock, so nothing a node can still replay through goes. Metadata that doesn't read
stays, with all after it.
A strict remake's metadata stays for good: by it a rejoining node, however far behind,
tells a strict remake of a swarm strict already (`catchup::prepare`, which reads the
generations it finds). There is at most one, short of such a remake. No new key and no
change to the rejoin: a node beyond the window that finds some entries and not others
quarantines with "cannot translate" rather than "outside the replay window".
Diffstat (limited to 'docs')
| -rw-r--r-- | docs/remakes.md | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/docs/remakes.md b/docs/remakes.md index 18576c4..ccccb1a 100644 --- a/docs/remakes.md +++ b/docs/remakes.md @@ -98,7 +98,7 @@ curl -X POST localhost:3000/admin/remakes -H 'Content-Type: application/json' -d | `baseHeads` | current heads | `replace` and `import` only: what the new document accounts for; writes after it are carried over. | | `settle` | 8 × keepalive | Voting period, a duration ([`configuration.md`](configuration.md), "Durations and sizes"). A short one only risks an abort for lack of votes. | | `switchDelay` | 1 × keepalive | Wait between commit and switch, so the commit reaches every node first. Shorter only with `?force=switchDelay`. | -| `replayWindow` | 1 epoch, 7 days | How far behind a returning node may be and still have its writes carried over automatically. | +| `replayWindow` | 1 epoch, 7 days | How far behind a returning node may be and still have its writes carried over automatically. A remake's snapshot keeps an earlier epoch's metadata (`_continuum/epochs`) only while that still covers a node on the epoch before, and a strict remake's for good. | | `archiveRetention` | 2 epochs, 30 days | How long nodes keep the old document. | A retention is kept until *every* limit it gives has passed. |
