Ugrás a tartalomhoz

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.