Atomicitet och återställning
AtomicFilesystem::write_atomic() skriver till en tillfällig fil, tömmer bufferten och
anropar fsync för filhandtaget, byter namn på filen så att den ersätter målsökvägen och försöker anropa fsync för
den överordnade katalogen. Misslyckade skrivningar tar bort sin egen tillfälliga fil.
Skrivande butikinstanser registrerar en markör per process under
.storh/writers/ och tar bort den vid normal avslutning. När en butik öppnas kontrolleras
markörerna: om alla markörers ägare fortfarande är aktiva (eller om inga finns) går öppningen på konstant tid. En markör vars ägarprocess har avslutats betyder att en skrivning kraschade, så öppningen genomsöker samlingen efter föräldralösa tillfälliga filer och rensar den inaktuella markören. repair() genomsöker alltid.
DocStore-reparation placerar skadade eller trunkerade postfiler i karantän under
.storh/corrupt/ och bygger om sekundära index utifrån återstående giltiga
poster. DocStore-verifiering jämför också indexfiler med en fullständig genomgång av posterna så att saknade eller inaktuella indexposter rapporteras innan de kan betraktas
som felfria.
Append-only-motorer tömmer bufferten och anropar fsync på sina loggfilhandtag innan händelser betraktas som lagrade i minnet. Beständighet vid strömavbrott beror fortfarande på att det underliggande filsystemet och monteringsalternativen respekterar synkronisering av filer och kataloger.
Den segmenterade loggen skriver varje rad så här:
<byte-length>\t<xxh32>\t<json>\n
Läsningar verifierar bytelängd och kontrollsumma. Återställningen söker igenom varje segment och trunkerar filen efter den sista kompletta, giltiga raden, vilket tar bort ofullständiga avslutande skrivningar. Verifieringen jämför det aktiva härledda tillståndsindexet med en oberoende uppspelning av segmenten, så att externt ändrat eller inaktuellt tillstånd rapporteras innan reparationen bygger upp det igen.
Köverifiering avkodar varje beständig köhändelse och jämför aktuellt
väntande-, bearbetnings-, klart-, nyttolast- och anspråksordningstillstånd med en oberoende
logguppspelning. Reparationen bygger upp tillståndet från queue.log och trunkerar ofullständiga
avslutande händelser. Anspråk och slutföranden håller kölåset medan de synkroniserar från
den beständiga loggen, så att flera arbetarprocesser inte hämtar samma väntande jobb.
Komprimeringen skriver nya compact-*-segmentfiler och uppdaterar sedan manifestet.
Om en process avslutas innan manifestet byts ut tar en ny öppning bort orefererade
komprimeringsresultat och fortsätter från det gamla manifestet. Slutförda komprimeringar lämnar avsiktligt gamla förseglade segment kvar så att läsare som redan läser från dem fortsätter att fungera.