Pereiti prie turinio

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:

Text
<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ą.