Atomaarusus ja taastamine
AtomicFilesystem::write_atomic() kirjutab ajutisse faili, tühjendab selle failikäepideme puhvri, kutsub välja
fsync-i ja nimetab faili sihttee peale ümber ning proovib seejärel kutsuda välja emakausta fsync-i. Ebaõnnestunud kirjutamise korral kustutatakse selle ajutine fail.
Kirjutavad hoidlainstantsid registreerivad protsessipõhise markeri asukohta
.storh/writers/ ja eemaldavad selle korralikul sulgemisel. Hoidla avamisel kontrollitakse
markereid: kui kõigi markerite omanikud on elus (või markereid pole), on avamine konstantse ajaga; kui markeri omanikprotsessi enam pole, siis kirjutaja jooksis kokku ning avamisel otsitakse kogust orvuks jäänud ajutised failid ja kustutatakse aegunud marker. repair() otsib alati.
DocStore'i parandamine paigutab vigased või kärbitud kirjefailid karantiini asukohta
.storh/corrupt/ ja koostab sekundaarsed indeksid uuesti allesjäänud kehtivate
kirjete põhjal. DocStore'i kontroll võrdleb indeksifaile ka kõigi kirjete läbiskannimise tulemustega, et puuduvad või aegunud indeksikirjed tuvastataks enne nende kehtivaks lugemist.
Ainult lisavad mootorid tühjendavad logifailide puhvrid ja kutsuvad välja fsync-i enne, kui loevad sündmused mälus kinnitatuks. Elektrikatkestuse korral sõltub andmete säilimine endiselt sellest, kas aluseks olev failisüsteem ja ühendamisvalikud failide ning kataloogide sünkroonimist järgivad.
Segmenteeritud logi kirjutab iga rea järgmiselt:
<byte-length>\t<xxh32>\t<json>\n
Lugemisel kontrollitakse baidipikkust ja kontrollsummat. Taastamisel skannitakse iga segmenti ja kärbitakse fail viimase täieliku kehtiva reani, eemaldades nii lõpus olevad poolikud kirjutised. Kontroll võrdleb aktiivset tuletatud olekuindeksit sõltumatu segmentide taasesitusega, et tuvastada väliselt muudetud või aegunud olek enne parandamist, mis selle uuesti koostab.
Järjekorra kontroll dekodeerib kõik püsivad järjekorrasündmused ning võrdleb praegust
ootel, töötlemisel, lõpetatud, koorma ja hõivejärjestuse olekut sõltumatu logi
taasesitusega. Parandamine koostab oleku uuesti asukohast queue.log ja kärbib
lõpus olevad poolikud sündmused. Hõivamised ja lõpetamised hoiavad järjekorra lukku
püsivast logist sünkroonimise ajal, nii et mitu tööprotsessi ei hõiva sama ootel tööd.
Tihendamisel kirjutatakse uued compact-* segmendifailid ja seejärel uuendatakse manifesti.
Kui protsess lõpetab enne manifesti vahetamist, eemaldatakse taasavamisel viitamata
tihendusfailid ja jätkatakse vana manifesti alusel. Lõpetatud tihendamisel jäetakse vanad suletud segmendid tahtlikult alles, et juba neist voogedastavad lugejad saaksid edasi töötada.