Atomicité et récupération
AtomicFilesystem::write_atomic() écrit dans un fichier temporaire, vide son contenu et synchronise son descripteur avec fsync, le renomme pour remplacer le chemin cible, puis tente de synchroniser le répertoire parent. En cas d'échec, le fichier temporaire correspondant est supprimé.
Les instances d'écriture du magasin enregistrent un marqueur par processus sous
.storh/writers/ et le suppriment à l'arrêt normal. À l'ouverture d'un magasin, ces marqueurs sont vérifiés : si tous leurs processus sont actifs (ou s'il n'y en a aucun), l'ouverture se fait en temps constant. Si le processus associé à un marqueur est arrêté, cela signifie qu'un écrivain a planté : l'ouverture parcourt alors la collection pour supprimer les fichiers temporaires orphelins et efface le marqueur obsolète. repair() effectue toujours ce parcours.
La réparation de DocStore met en quarantaine les fichiers d'enregistrement corrompus ou tronqués sous
.storh/corrupt/ et reconstruit les index secondaires à partir des enregistrements valides restants. La vérification de DocStore compare aussi les fichiers d'index à un balayage complet des enregistrements afin de signaler les entrées d'index manquantes ou obsolètes avant qu'elles soient considérées comme saines.
Les moteurs à journal en ajout uniquement vident leur journal et synchronisent son descripteur avec fsync avant de considérer les événements comme validés en mémoire. La durabilité en cas de coupure de courant dépend toujours du système de fichiers sous-jacent et des options de montage, qui doivent honorer la synchronisation des fichiers et des répertoires.
Le journal segmenté écrit chaque ligne sous la forme suivante :
<byte-length>\t<xxh32>\t<json>\n
Les lectures vérifient la longueur en octets et la somme de contrôle. La récupération parcourt chaque segment et tronque le fichier à la dernière ligne complète et valide, ce qui supprime les écritures finales incomplètes. La vérification compare l'index d'état dérivé actif à une relecture indépendante des segments ; les modifications externes ou les états obsolètes sont ainsi signalés avant que la réparation ne reconstruise l'index.
La vérification de Queue décode chaque événement durable et compare les états actuels en attente, en cours de traitement et terminés, ainsi que l'état des données utiles et l'ordre des revendications, à une relecture indépendante du journal. La réparation reconstruit cet état à partir de queue.log et tronque les événements finaux incomplets. Les revendications et les finalisations verrouillent la file pendant la synchronisation depuis le journal durable, afin que plusieurs processus de travail ne revendiquent pas le même travail en attente.
Le compactage écrit de nouveaux fichiers de segment compact-*, puis met à jour le manifeste. Si un processus s'arrête avant l'échange du manifeste, la réouverture supprime les fichiers de compactage non référencés et reprend à partir de l'ancien manifeste. Les compactages terminés conservent volontairement les anciens segments scellés afin que les lecteurs qui les parcourent déjà puissent continuer à les lire.