
# Atomicita a obnova

`AtomicFilesystem::write_atomic()` zapisuje do dočasného súboru, synchronizuje údaje a
fsyncuje deskriptor súboru, premenuje súbor na cieľovú cestu a pokúsi sa fsyncovať
nadriadený adresár. Pri neúspešnom zápise odstráni vlastný dočasný súbor.

Inštancie úložísk určené na zápis zaregistrujú značku procesu pod
`.storh/writers/` a pri riadnom ukončení ju odstránia. Pri otvorení úložiska sa skontrolujú
tieto značky: ak sú všetci vlastníci značiek stále aktívni (alebo značky
neexistujú), otvorenie prebehne v konštantnom čase. Značka s ukončeným
vlastníckym procesom znamená, že zapisujúci proces havaroval; pri otvorení sa
preto prehľadá kolekcia, odstránia osirelé dočasné súbory a vymaže neaktuálna
značka. `repair()` vždy vykoná kontrolu.

Oprava DocStore presunie poškodené alebo skrátené súbory záznamov do karantény pod
`.storh/corrupt/` a z platných záznamov vytvorí sekundárne indexy nanovo. Overenie DocStore tiež porovná súbory indexov s úplným skenom záznamov, aby nahlásilo chýbajúce alebo zastarané položky indexu skôr, než sa budú považovať za správne.

Moduly s protokolom iba na pridávanie vyprázdnia a fsyncujú svoje súbory protokolu ešte predtým, ako sa udalosti považujú za potvrdené v pamäti. Odolnosť voči výpadku napájania stále závisí od toho, či podkladový súborový systém a možnosti pripojenia správne vykonávajú synchronizáciu súborov a adresárov.

Segmentovaný protokol zapisuje každý riadok v tomto tvare:

```text
<byte-length>\t<xxh32>\t<json>\n
```

Pri čítaní sa overuje dĺžka v bajtoch a kontrolný súčet. Obnova prehľadá každý segment a skráti súbor na poslednom úplnom platnom riadku, čím odstráni neúplné zápisy na konci. Overenie porovná aktívny odvodený index stavu s nezávislým prehratím segmentov, aby pred opravou nahlásilo externe zmenený alebo zastaraný stav a oprava ho mohla nanovo vytvoriť.

Overenie frontu dekóduje každú trvalú udalosť frontu a porovná aktuálny stav čakajúcich, spracúvaných a dokončených úloh, ich údajov a poradia nárokovania s nezávislým prehratím protokolu. Oprava obnoví tento stav z `queue.log` a odstráni neúplné udalosti na konci. Pri nárokovaní a dokončovaní úloh sa počas synchronizácie s trvalým protokolom uzamkne front, takže viaceré procesy pracovníkov nemôžu prevziať tú istú čakajúcu úlohu.

Kompakcia zapisuje nové súbory segmentov `compact-*` a potom aktualizuje manifest.
Ak proces skončí pred výmenou manifestu, pri opätovnom otvorení sa odstráni
neodkazovaný výstup kompakcie a pokračuje sa podľa starého manifestu. Po dokončenej
kompakcii sa staré uzavreté segmenty zámerne ponechávajú, aby čitatelia, ktorí ich už
čítajú, mohli pokračovať bez problémov.
