Přejít k obsahu

Atomicita a obnova

AtomicFilesystem::write_atomic() zapisuje do dočasného souboru, provede flush a fsync jeho popisovače, přejmenuje jej přes cílovou cestu a pokusí se provést fsync nadřazeného adresáře. Při neúspěšném zápisu odstraní vlastní dočasný soubor.

Instance úložiště zapisující data zaregistrují značku pro daný proces pod .storh/writers/ a při řádném ukončení ji odstraní. Při otevření úložiště se tyto značky zkontrolují: pokud jsou vlastníci všech značek stále aktivní (nebo žádné značky neexistují), otevření proběhne v konstantním čase. Značka patřící ukončenému procesu znamená, že zapisující proces havaroval, takže se při otevření prohledá kolekce a odstraní osiřelé dočasné soubory i zastaralá značka. repair() prohledává kolekci vždy.

Oprava DocStore přesune poškozené nebo zkrácené soubory záznamů do karantény pod .storh/corrupt/ a z platných zbývajících záznamů znovu sestaví sekundární indexy. Ověření DocStore také porovná soubory indexů s úplnou kontrolou záznamů, takže chybějící nebo zastaralé položky indexu se nahlásí dřív, než budou považovány za platné.

Enginy s připojováním dat nejprve provedou flush a fsync popisovačů svých souborů protokolu a teprve potom považují události v paměti za potvrzené. Odolnost proti výpadku napájení stále závisí na tom, zda používaný souborový systém a jeho možnosti připojení respektují synchronizaci souborů a adresářů.

Segmentovaný protokol zapisuje každý řádek v tomto formátu:

Text
<byte-length>\t<xxh32>\t<json>\n

Při čtení se ověřuje délka v bajtech a kontrolní součet. Obnova prohledá každý segment a zkrátí soubor za posledním úplným platným řádkem, čímž odstraní neúplné zápisy na konci. Ověření porovná aktivní odvozený index stavu s nezávislým přehráním segmentů, takže změněný nebo zastaralý stav se nahlásí ještě před opravou, která jej znovu sestaví.

Ověření fronty dekóduje každou trvalou událost fronty a porovná aktuální stav čekajících, zpracovávaných a dokončených úloh, dat i pořadí nárokování s nezávislým přehráním protokolu. Oprava znovu sestaví tento stav z queue.log a zkrátí neúplné události na konci. Při nárokování a dokončování úloh se drží zámek fronty po dobu synchronizace s trvalým protokolem, takže si více pracovních procesů nemůže nárokovat stejnou čekající úlohu.

Kompakce zapíše nové segmentové soubory compact-* a poté aktualizuje manifest. Pokud proces skončí před výměnou manifestu, nové otevření odstraní nepoužívaný výstup kompakce a pokračuje podle starého manifestu. Po dokončené kompakci záměrně zůstávají staré uzavřené segmenty na místě, aby čtenáři, kteří je již procházejí, mohli pokračovat.