
# Атомарност и възстановяване

`AtomicFilesystem::write_atomic()` записва във временен файл, извиква flush и fsync за файловия дескриптор, преименува файла върху целевия път и се опитва да извика fsync за родителската директория. При неуспешен запис временният файл се изтрива.

Инстанциите на хранилището, които записват, регистрират маркер за текущия процес под `.storh/writers/` и го премахват при нормално изключване. При отваряне на хранилището се проверяват тези маркери: ако собственикът на всеки маркер все още работи (или няма маркери), отварянето отнема постоянно време; ако процесът собственик на маркер е прекратен, записващият процес се е сринал и при отварянето колекцията се проверява за осиротели временни файлове, а остарелият маркер се изчиства. `repair()` винаги извършва такава проверка.

При поправка DocStore премества повредените или прекъснати файлове със записи под `.storh/corrupt/` и изгражда повторно вторичните индекси от останалите валидни записи. Проверката на DocStore също сравнява индексните файлове с пълно сканиране на записите, за да открие липсващи или остарели записи в индекса, преди хранилището да бъде отчетено като изправно.

Механизмите само за добавяне записват и извикват flush и fsync за файловите дескриптори на журналите, преди да считат събитията за потвърдени в паметта. Устойчивостта при загуба на захранване все пак зависи от това дали базовата файлова система и опциите за монтиране спазват синхронизирането на файлове и директории.

Сегментираният журнал записва всеки ред в следния формат:

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

При четене се проверяват дължината в байтове и контролната сума. Възстановяването сканира всеки сегмент и съкращава файла след последния пълен валиден ред, с което премахва прекъснатите записи в края. Проверката сравнява активния производен индекс на състоянието с независимо възпроизвеждане на сегментите, така че външно променено или остаряло състояние се отчита, преди поправката да го изгради повторно.

Проверката на опашката декодира всяко трайно събитие в опашката и сравнява текущото състояние на чакащите, обработваните и завършените задачи, данните и реда на заявките с независимо възпроизвеждане на журнала. Поправката изгражда състоянието наново от `queue.log` и съкращава прекъснатите събития в края. При заявяване и завършване заключването на опашката се държи, докато състоянието се синхронизира с трайния журнал, така че няколко работни процеса да не заявят една и съща чакаща задача.

Уплътняването записва нови сегментни файлове `compact-*` и след това актуализира манифеста. Ако процесът приключи преди подмяната на манифеста, при повторно отваряне неупоменатите резултати от уплътняването се изтриват и работата продължава със стария манифест. След завършено уплътняване старите запечатани сегменти умишлено се запазват, за да останат достъпни за читателите, които вече ги преглеждат.
