
# Atomicitate și recuperare

`AtomicFilesystem::write_atomic()` scrie într-un fișier temporar, face flush și
fsync pe acel descriptor de fișier, îl redenumește peste calea țintă și încearcă să facă fsync
pe directorul părinte. Scrierile eșuate își șterg propriul fișier temporar.

Instanțele de stocare pentru scriere înregistrează un marcaj per proces în
`.storh/writers/` și îl elimină la închiderea normală. La deschiderea unei stocări se verifică
aceste marcaje: dacă proprietarul fiecărui marcaj este activ (sau nu există marcaje), deschiderea
are timp constant; un marcaj al cărui proces proprietar nu mai există înseamnă că un proces de scriere
s-a blocat, așa că deschiderea parcurge colecția pentru a găsi fișiere temporare orfane și
șterge marcajul învechit. `repair()` parcurge întotdeauna colecția.

Repararea DocStore pune în carantină fișierele de înregistrări corupte sau trunchiate în
`.storh/corrupt/` și reconstruiește indexurile secundare din înregistrările valide
rămase. Verificarea DocStore compară, de asemenea, fișierele index cu o scanare completă a înregistrărilor,
astfel încât intrările de index lipsă sau învechite să fie raportate înainte de a putea fi considerate
valide.

Motoarele cu jurnal doar pentru adăugare fac flush și fsync pentru descriptorii fișierelor jurnal înainte de a considera
 evenimentele confirmate în memorie. Durabilitatea în cazul unei pene de curent depinde în continuare de sistemul de fișiere
și de opțiunile de montare care trebuie să respecte sincronizările fișierelor și directoarelor.

Jurnalul segmentat scrie fiecare linie astfel:

```text
<byte-length>\t<xxh32>\t<json>\n
```

Citirile verifică lungimea în octeți și suma de control. Recuperarea scanează fiecare segment și
trunchiază fișierul la ultima linie completă și validă, eliminând astfel
scrierile finale incomplete. Verificarea compară indexul activ al stării derivate cu o reluare independentă a segmentelor,
astfel încât modificările externe sau starea învechită sunt raportate înainte ca repararea să o
reconstruiască.

Verificarea cozii decodifică fiecare eveniment durabil din coadă și compară stările curente în așteptare, în curs de procesare, finalizată, payload și ordinea revendicărilor cu o reluare independentă a jurnalului. Repararea reconstruiește starea din `queue.log` și trunchiază evenimentele finale incomplete. Revendicările și finalizările păstrează blocarea cozii în timp ce sincronizează din jurnalul durabil, astfel încât mai multe procese de lucru să nu revendice aceeași sarcină în așteptare.

Compactarea scrie fișiere noi de segment `compact-*`, apoi actualizează manifestul.
Dacă un proces se închide înainte de schimbarea manifestului, la redeschidere se elimină
rezultatele de compactare nereferențiate și se continuă de la manifestul vechi. Compactările finalizate
lasă intenționat segmentele vechi sigilate pe loc, astfel încât cititorii care le parcurg deja
să le poată folosi în continuare.
