Pāriet uz saturu

Atomiskums un atkopšana

AtomicFilesystem::write_atomic() raksta pagaidu failā, iztukšo buferi un izsauc fsync šī faila apstrādes objektam, pārdēvē to par mērķa ceļu un mēģina izsaukt fsync vecākdirektorijai. Neizdevušies ieraksti izdzēš savu pagaidu failu.

Rakstošās krātuves instances reģistrē katram procesam atsevišķu marķieri mapē .storh/writers/ un tīras izslēgšanas laikā to noņem. Atverot krātuvi, tiek pārbaudīti šie marķieri: ja visu marķieru īpašnieki ir aktīvi (vai marķieru nav), atvēršana aizņem nemainīgu laiku; ja marķiera īpašnieka procesa vairs nav, rakstītājs ir avarējis, tāpēc atvēršanas laikā tiek pārmeklēta kolekcija, lai atrastu bāreņpagaidu failus, un novecojušais marķieris tiek notīrīts. repair() vienmēr veic pārmeklēšanu.

DocStore labošanas laikā bojāti vai saīsināti ierakstu faili tiek pārvietoti karantīnā mapē .storh/corrupt/, un sekundārie indeksi tiek atjaunoti no atlikušajiem derīgajiem ierakstiem. DocStore pārbaude salīdzina arī indeksu failus ar pilnu ierakstu pārskatu, lai trūkstošie vai novecojušie indeksa ieraksti tiktu atklāti, pirms tos var uzskatīt par derīgiem.

Tikai papildināšanas dzinēji iztukšo buferi un izsauc fsync savu žurnālfailu apstrādes objektiem, pirms uzskata notikumus par ierakstītiem atmiņā. Aizsardzība pret datu zudumu elektroapgādes pārtraukuma gadījumā joprojām ir atkarīga no tā, vai pamatā esošā failu sistēma un montēšanas opcijas ievēro failu un direktoriju sinhronizāciju.

Segmentētais žurnāls ieraksta katru rindu šādi:

Text
<byte-length>\t<xxh32>\t<json>\n

Lasīšanas laikā tiek pārbaudīts baitu garums un kontrolsumma. Atkopšanas laikā tiek pārmeklēts katrs segments un fails tiek saīsināts līdz pēdējai pilnajai derīgajai rindai, tādējādi tiek noņemti nepilnīgi ieraksti faila beigās. Pārbaude salīdzina aktīvo atvasināto stāvokļa indeksu ar neatkarīgu segmentu atkārtotu nolasīšanu, lai pirms labošanas un indeksa atjaunošanas tiktu ziņots par ārēji mainītu vai novecojušu stāvokli.

Rindas pārbaudē tiek atkodēts katrs noturīgais rindas notikums un pašreizējais gaidošais, apstrādātais, pabeigtais, datu un pretenziju secības stāvoklis tiek salīdzināts ar neatkarīgu žurnāla atkārtotu nolasīšanu. Labošana atjauno šo stāvokli no queue.log un saīsina žurnālu, lai noņemtu nepilnīgus notikumus beigās. Pieprasījumi un pabeigšanas darbības bloķē rindu, sinhronizējot to no noturīgā žurnāla, tāpēc vairāki darba procesi nevar pieprasīt vienu un to pašu gaidošo uzdevumu.

Saspiešana ieraksta jaunus compact-* segmentu failus un pēc tam atjaunina manifestu. Ja process beidzas pirms manifesta nomaiņas, atkārtotā atvēršana noņem neatsauktos saspiešanas izvades failus un turpina darbu ar veco manifestu. Pēc pabeigtas saspiešanas vecie slēgtie segmenti tiek apzināti atstāti, lai lasītāji, kas tos jau lasa straumē, joprojām varētu tos izmantot.