Atomicidad y recuperación
AtomicFilesystem::write_atomic() escribe en un archivo temporal, vacía y sincroniza con fsync su descriptor, lo renombra sobre la ruta de destino e intenta sincronizar con fsync el directorio padre. Si una escritura falla, se elimina su propio archivo temporal.
Las instancias de escritura del almacén registran un marcador por proceso en .storh/writers/ y lo eliminan al cerrarse correctamente. Al abrir un almacén se comprueban esos marcadores: si el proceso propietario de cada marcador sigue activo (o no hay ninguno), la apertura tarda un tiempo constante; si el proceso propietario de un marcador ya no existe, significa que un escritor se bloqueó, por lo que la apertura recorre la colección en busca de archivos temporales huérfanos y elimina el marcador obsoleto. repair() siempre hace este recorrido.
La reparación de DocStore pone en cuarentena los archivos de registros dañados o truncados en .storh/corrupt/ y reconstruye los índices secundarios a partir de los registros válidos restantes. La verificación de DocStore también compara los archivos de índice con un recorrido completo de los registros para informar de entradas de índice ausentes u obsoletas antes de considerarlas correctas.
Los motores de solo anexado vacían y sincronizan con fsync los descriptores de sus archivos de registro antes de considerar confirmados en memoria los eventos. La durabilidad ante un corte de energía sigue dependiendo de que el sistema de archivos subyacente y las opciones de montaje respeten la sincronización de archivos y directorios.
El registro segmentado escribe cada línea así:
<byte-length>\t<xxh32>\t<json>\n
Las lecturas verifican la longitud en bytes y la suma de comprobación. La recuperación recorre cada segmento y trunca el archivo en la última línea completa y válida, lo que elimina las escrituras finales incompletas. La verificación compara el índice de estado derivado activo con una reproducción independiente de los segmentos, para informar de estados modificados externamente u obsoletos antes de que la reparación los reconstruya.
La verificación de la cola decodifica todos los eventos persistentes y compara los estados actuales de pendientes, en proceso, completados, carga útil y orden de reclamación con una reproducción independiente del registro. La reparación reconstruye ese estado a partir de queue.log y trunca los eventos finales incompletos. Las reclamaciones y las finalizaciones mantienen bloqueada la cola mientras se sincronizan con el registro persistente, por lo que varios procesos de trabajo no reclaman el mismo trabajo pendiente.
La compactación escribe nuevos archivos de segmento compact-* y luego actualiza el manifiesto. Si un proceso termina antes de ese cambio de manifiesto, al volver a abrir se elimina la salida de compactación sin referencias y se continúa con el manifiesto anterior. Las compactaciones completadas dejan intencionadamente los segmentos sellados antiguos para que los lectores que ya los están leyendo sigan funcionando.