Preskočiť na obsah

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.