Situace
Provider spadne, je zabit nebo ztratí spojení. Epizoda, kterou otevřel, je stále v state/sessions-open/, protože koncová událost, která by ji uzavřela, nikdy nedorazila. Ten soubor nevlastní nic: session start se stejným klíčem je navždy odmítnuto, continuity hlásí epizodu, ve které nikdo není, a práce, kterou další worker skutečně odvede, se nepřipíše žádné epizodě.
Smazat soubor by bylo nasnadě, a bylo by to špatně. Epizoda je záznam úseku práce a řádky účetní knihy, které orazítkovala, jsou jediným svědectvím o tom, co tento úsek obsahoval.
Co spouštíte
recover episodes --check: kandidáti, každý s posledním okamžikem, kdy je známo, že žil, a s tím, co by se s ním stalorecover episodes: uzavře ty, jejichž důkazy říkají, že klient je pryč, a nic jiného
Každý krok zde čte úložiště přímo přes recover a ne přes session status, a je to záměrné: session status vypisuje startovací head epizody, což je v každém repozitáři, kde demonstrace běží, jiný commit, takže scénář, který by na něm tvrdil, by způsobil, že se publikovaný katalog liší od checkoutu, který jej vygeneroval.
Scénář
setup: session-stranded
given:
- 'two episodes open here: one whose client is gone, and one this process is inside'
steps:
- id: the-plan
run: ['recover', 'episodes', '--check']
note: 'every candidate is measured and the measurement is printed, including the ones nothing happens to'
expect:
exit: 0
stdout_contains: ['last seen 2020-01-01T00:00:00Z', 'stranded:', 'live: this process is inside it', 'check: 1 action']
- id: dry-run-wrote-nothing
run: ['recover', 'episodes', '--check']
note: 'the check is a dry run: the second one plans exactly what the first one did'
expect:
exit: 0
stdout_contains: ['stranded:', 'check: 1 action']
- id: recover
run: ['recover', 'episodes']
note: 'the stranded episode is closed into a record; the live one is untouched'
expect:
exit: 0
stdout_contains: ['.ai/repo/sessions/', 'recovered: 1 action']
- id: idempotent
run: ['recover', 'episodes']
note: 'a second run has nothing to do: one episode, one record'
expect:
exit: 0
stdout_contains: ['nothing to recover']
- id: still-live
run: ['recover', 'episodes', '--check']
note: 'the episode somebody is working in survived the sweep and is still listed as live'
expect:
exit: 0
stdout_contains: ['live: this process is inside it', 'nothing to recover']
then:
- 'an episode under the staleness threshold is never closed, and neither is the one this process resolves to'
- 'an episode whose last sign of life cannot be read as a timestamp is skipped and counted, never closed'
- 'the recovered record claims no commits and no changed files: the tree at recovery time belongs to whoever is working now'
- 'the reason is a ledger event, session.recovered, naming the recovered episode rather than the recoverer'Výsledek
Úložiště drží jeden záznam na epizodu a žádnou epizodu, ve které nikdo není. Záznam sám ve svém těle říká, že ho napsala obnova a na základě jakých důkazů — takže čtenář o měsíce později pozná uzavřenou epizodu od obnovené, a ani jednu od vymyšlené, protože obnova nezapisuje nic, co nedokáže doložit.