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

```text
<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.
