Atomiškumas ir atkūrimas
AtomicFilesystem::write_atomic() įrašo į laikinąjį failą, išsiunčia jo failo deskriptorių į diską ir
fsync, pervadina failą į tikslinį kelią ir bando išsiųsti į diską pirminį katalogą.
Nepavykus įrašyti pašalinamas laikinasis failas.
Rašantys saugyklos egzemplioriai užregistruoja proceso žymeklį faile
.storh/writers/ ir tvarkingai išsijungdami jį pašalina. Atidarant saugyklą tikrinami
šie žymekliai: jei visi jų savininkai vis dar veikia (arba žymeklių nėra), atidarymas
trunka pastovų laiką; jei žymeklio savininko procesas jau baigėsi, vadinasi, rašymo
procesas nutrūko, todėl atidarant perrenkama kolekcija, ieškant našlaičių laikinųjų failų,
ir pašalinamas pasenęs žymeklis. repair() visada perrenka.
DocStore taisymo metu sugadintų arba sutrumpintų įrašų failai perkeliami į
.storh/corrupt/, o antriniai indeksai atkuriami iš likusių galiojančių
įrašų. DocStore tikrinimas taip pat palygina indeksų failus su visų įrašų
peržiūra, kad trūkstami ar pasenę indekso įrašai būtų aptikti prieš sistemai juos
palaikant galiojančiais.
Tik pridedantys duomenis varikliai išsiunčia žurnalo failų deskriptorius į diską ir atlieka fsync prieš laikydami įvykius patvirtintais atmintyje. Apsauga nuo duomenų praradimo nutrūkus maitinimui vis tiek priklauso nuo to, ar failų sistema ir prijungimo parinktys tinkamai vykdo failų bei katalogų sinchronizavimą.
Segmentuotas žurnalas kiekvieną eilutę įrašo taip:
<byte-length>\t<xxh32>\t<json>\n
Skaitant tikrinamas baitų ilgis ir kontrolinė suma. Atkuriant peržiūrimas kiekvienas segmentas, o failas sutrumpinamas ties paskutine visa galiojančia eilute, pašalinant nepilnus pabaigos įrašus. Tikrinant aktyvi būsena lyginama su nepriklausomai atkurtu segmentų įrašu, kad išoriniai pakeitimai ar pasenusi būsena būtų aptikti prieš atkuriant ją iš naujo.
Tikrinant eilę iškoduojami visi ilgalaikiai eilės įvykiai, o dabartinė laukiančių,
apdorojamų, užbaigtų užduočių, jų duomenų ir rezervavimo eiliškumo būsena palyginama su
nepriklausomai atkurtais žurnalo duomenimis. Taisant būsena atkuriama iš queue.log, o nepilni
pabaigos įvykiai pašalinami sutrumpinant žurnalą. Rezervuojant užduotis ir jas užbaigiant, eilės užraktas laikomas iki sinchronizavimo su
ilgalaikiu žurnalu, todėl keli darbuotojų procesai tos pačios laukiančios užduoties nepaima.
Glaudinant įrašomi nauji compact-* segmentų failai, tada atnaujinamas manifestas.
Jei procesas baigiasi prieš apsikeičiant manifestu, iš naujo atidarant pašalinami
nebereikalingi glaudinimo failai ir tęsiama pagal seną manifestą. Baigus glaudinti
seni uždaryti segmentai paliekami, kad juos jau skaitantys procesai galėtų tęsti darbą.