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:
<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.