Atomicitás és helyreállítás
A(z) AtomicFilesystem::write_atomic() ideiglenes fájlba ír, kiüríti a puffert, meghívja a
fsync-et a fájlkezelőn, lecseréli vele a célútvonalat, majd megpróbálja meghívni
a fsync-et a szülőkönyvtáron is. Sikertelen íráskor törli a saját ideiglenes fájlját.
Az író példányok folyamatonkénti jelölőt regisztrálnak a(z)
.storh/writers/ alatt, és szabályos leálláskor eltávolítják. A tár megnyitásakor
ellenőrzi ezeket a jelölőket: ha minden jelölő tulajdonos folyamata él (vagy nincs
jelölő), a megnyitás állandó idejű; ha egy jelölő tulajdonos folyamata már nem fut,
az író összeomlott, ezért a megnyitás végigpásztázza a gyűjteményt az árva ideiglenes
fájlokért, és törli az elavult jelölőt. A(z) repair() mindig végigpásztáz.
A DocStore javítása karanténba helyezi a sérült vagy csonka rekordfájlokat a(z)
.storh/corrupt/ alatt, majd újraépíti a másodlagos indexeket a megmaradt érvényes
rekordokból. A DocStore ellenőrzése a teljes rekordpásztázás eredményével is
összeveti az indexfájlokat, így a hiányzó vagy elavult indexbejegyzések még azelőtt
jelentésre kerülnek, hogy az indexeket érvényesnek tekintené.
A csak hozzáfűző motorok kiürítik a puffert, és meghívják a fsync-et a napló fájlkezelőin, mielőtt az eseményeket memóriában véglegesítettnek tekintenék. Az áramkimaradással szembeni tartósság továbbra is attól függ, hogy az alapul szolgáló fájlrendszer és csatolási beállítások megfelelően kezelik-e a fájl- és könyvtárszinkronizálást.
A szegmentált napló minden sort a következő formátumban ír ki:
<byte-length>\t<xxh32>\t<json>\n
Olvasáskor ellenőrzi a bájthosszt és az ellenőrző összeget. A helyreállítás végigpásztázza az egyes szegmenseket, és a fájlt az utolsó teljes, érvényes sor után csonkolja, eltávolítva ezzel a végén félbemaradt írásokat. Az ellenőrzés a származtatott állapot aktív indexét független szegmens-újrajátszás eredményével veti össze, így a külsőleg módosított vagy elavult állapot még a javítás előtti újraépítés előtt jelentésre kerül.
A Queue ellenőrzése dekódolja az összes tartós sorbaállítási eseményt, majd a
függő, feldolgozás alatt álló és kész állapotot, a hasznos adatot és az igénylési
sorrendet független napló-újrajátszással veti össze. A javítás a(z) queue.log
alapján újraépíti ezt az állapotot, és csonkolja a végén félbemaradt eseményeket. Az
igénylések és befejezések a tartós naplóból való szinkronizálás közben zárolják a
sorokat, így több munkafolyamat sem igényelheti ugyanazt a függő feladatot.
A tömörítés új compact-* szegmensfájlokat ír, majd frissíti a jegyzéket.
Ha a folyamat a jegyzék cseréje előtt leáll, az újranyitás eltávolítja a nem hivatkozott
tömörítési kimenetet, és a régi jegyzékből folytatja. A befejezett tömörítések
szándékosan a helyükön hagyják a régi lezárt szegmenseket, hogy a belőlük már olvasó
folyamatok továbbra is érvényes adatot kapjanak.