
# Atomicitet og gendannelse

`AtomicFilesystem::write_atomic()` skriver til en midlertidig fil, tømmer bufferen og kører fsync på filhåndtaget, omdøber filen, så den erstatter målstien, og forsøger derefter at køre fsync på den overordnede mappe. Mislykkede skrivninger fjerner deres egen midlertidige fil.

Skrivende lagerinstanser registrerer en markør pr. proces under `.storh/writers/` og fjerner den ved normal nedlukning. Når et lager åbnes, kontrolleres markørerne: Hvis alle markører tilhører aktive processer (eller der ikke findes nogen), tager åbningen konstant tid. Hvis ejeren af en markør ikke længere kører, er en skriveproces gået ned, så åbningen gennemgår samlingen for forældreløse midlertidige filer og fjerner den forældede markør. `repair()` gennemgår altid samlingen.

DocStore-reparation sætter korrupte eller afkortede postfiler i karantæne under `.storh/corrupt/` og genopbygger sekundære indekser ud fra de resterende gyldige poster. DocStore-verificering sammenligner også indeksfiler med en fuld gennemgang af posterne, så manglende eller forældede indeksværdier rapporteres, før de kan betragtes som i orden.

Append-only-motorer tømmer bufferen og kører fsync på deres logfilhåndtag, før de betragter hændelser som gemt i hukommelsen. Holdbarhed ved strømsvigt afhænger stadig af, om det underliggende filsystem og monteringsindstillingerne overholder synkronisering af filer og mapper.

Den segmenterede log skriver hver linje sådan:

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

Læsninger kontrollerer bytelængden og kontrolsummen. Ved gendannelse gennemgås hvert segment, og filen afkortes ved den sidste komplette, gyldige linje, så ufuldstændige afsluttende skrivninger fjernes. Verificering sammenligner det aktive afledte tilstandsindeks med en uafhængig afspilning af segmenterne, så eksternt ændret eller forældet tilstand rapporteres, før reparation genopbygger den.

Køverificering afkoder hver varige køhændelse og sammenligner den aktuelle tilstand for ventende, igangværende og færdige job samt data og rækkefølgen af krav med en uafhængig logafspilning. Reparation genopbygger tilstanden fra `queue.log` og afkorter ufuldstændige afsluttende hændelser. Krav og fuldførelser holder kølåsen, mens de synkroniserer fra den varige log, så flere worker-processer ikke tager det samme ventende job.

Komprimering skriver nye `compact-*`-segmentfiler og opdaterer derefter manifestet. Hvis en proces afsluttes før udskiftningen af manifestet, fjerner genåbningen det ikke-refererede komprimeringsoutput og fortsætter fra det gamle manifest. Fuldførte komprimeringer lader med vilje gamle forseglede segmenter blive liggende, så læsere, der allerede strømmer fra dem, fortsat virker.
