Атомарност и възстановяване
AtomicFilesystem::write_atomic() записва във временен файл, извиква flush и fsync за файловия дескриптор, преименува файла върху целевия път и се опитва да извика fsync за родителската директория. При неуспешен запис временният файл се изтрива.
Инстанциите на хранилището, които записват, регистрират маркер за текущия процес под .storh/writers/ и го премахват при нормално изключване. При отваряне на хранилището се проверяват тези маркери: ако собственикът на всеки маркер все още работи (или няма маркери), отварянето отнема постоянно време; ако процесът собственик на маркер е прекратен, записващият процес се е сринал и при отварянето колекцията се проверява за осиротели временни файлове, а остарелият маркер се изчиства. repair() винаги извършва такава проверка.
При поправка DocStore премества повредените или прекъснати файлове със записи под .storh/corrupt/ и изгражда повторно вторичните индекси от останалите валидни записи. Проверката на DocStore също сравнява индексните файлове с пълно сканиране на записите, за да открие липсващи или остарели записи в индекса, преди хранилището да бъде отчетено като изправно.
Механизмите само за добавяне записват и извикват flush и fsync за файловите дескриптори на журналите, преди да считат събитията за потвърдени в паметта. Устойчивостта при загуба на захранване все пак зависи от това дали базовата файлова система и опциите за монтиране спазват синхронизирането на файлове и директории.
Сегментираният журнал записва всеки ред в следния формат:
<byte-length>\t<xxh32>\t<json>\n
При четене се проверяват дължината в байтове и контролната сума. Възстановяването сканира всеки сегмент и съкращава файла след последния пълен валиден ред, с което премахва прекъснатите записи в края. Проверката сравнява активния производен индекс на състоянието с независимо възпроизвеждане на сегментите, така че външно променено или остаряло състояние се отчита, преди поправката да го изгради повторно.
Проверката на опашката декодира всяко трайно събитие в опашката и сравнява текущото състояние на чакащите, обработваните и завършените задачи, данните и реда на заявките с независимо възпроизвеждане на журнала. Поправката изгражда състоянието наново от queue.log и съкращава прекъснатите събития в края. При заявяване и завършване заключването на опашката се държи, докато състоянието се синхронизира с трайния журнал, така че няколко работни процеса да не заявят една и съща чакаща задача.
Уплътняването записва нови сегментни файлове compact-* и след това актуализира манифеста. Ако процесът приключи преди подмяната на манифеста, при повторно отваряне неупоменатите резултати от уплътняването се изтриват и работата продължава със стария манифест. След завършено уплътняване старите запечатани сегменти умишлено се запазват, за да останат достъпни за читателите, които вече ги преглеждат.