Arxi Docs

Documentación de grabación de pruebas y evidencia a prueba de manipulaciones.

Otros documentos del producto

Arquitectura de Almacenamiento Arxi

Audience: Engineers changing persistence logic, query semantics, schema, Audiencia: Ingenieros que cambian la lógica de persistencia, la semántica de consultas, el esquema o los backends de almacenamiento.


Tabla de Contenidos

  1. Resumen Ejecutivo
  2. Contratos de Rasgos de Almacenamiento
  3. Backend en memoria
  4. Backend de SQLite
  5. Esquema de SQLite e Indexación
  6. Cumplimiento de la Continuidad de la Cadena
  7. Semántica de Consulta y Paginación
  8. Corrupción y Manejo de Errores
  9. Referencia Cruzada Archivo por Archivo

Resumen Ejecutivo

arxi-store proporciona la abstracción de persistencia y dos backends concretos:

  • InMemoryStore para pruebas deterministas y ejecución local,
  • SqliteStore para operación duradera con WAL y verificaciones transaccionales.

Ambos implementan contratos de rasgos compartidos para operaciones de sobre, adjunto y segmento. F:crates/arxi-store/src/lib.rs L11-L37 F:crates/arxi-store/src/lib.rs L49-L71


Contratos de Rasgos de Almacén

El contrato de almacenamiento se expresa como tres rasgos asíncronos:

  • EnvelopeStore: agregar/obtener/consultar/cabeza de cadena/segmentar sobres,
  • AttachmentStore: poner/obtener/existe para blobs dirigidos por contenido,
  • SegmentStore: crear/sellar/listar/obtener metadatos y génesis.

Los invariantes centrales incluyen un comportamiento de solo anexar, verificaciones de continuidad de la cadena y la inmutabilidad de segmentos sellados. La creación de segmentos es de cierre seguro: los almacenes rechazan un nuevo segmento cuando ya existe otro segmento abierto o cuando el ID del segmento ya existe. F:crates/arxi-store/src/traits.rs L43-L101 F:crates/arxi-store/src/traits.rs L107-L138 F:crates/arxi-store/src/traits.rs L144-L206


Backend en memoria

InMemoryStore utiliza mapas y vectores protegidos por bloqueo, preservando las verificaciones de invariante pero sin garantías de consistencia ante fallos. F:crates/arxi-store/src/memory.rs L12-L16

Destacados del comportamiento:

  • valida el estado del segmento y la continuidad de la cadena al agregar,
  • mantiene las actualizaciones de los IDs de sobre primero/último y de la cadena principal,
  • aplica reglas de creación de segmento único abierto y sin ID de segmento duplicado,
  • admite la enumeración de segmentos deterministas por created_at,
  • impone un orden de consulta de sobreenvoltura determinista por segment_id y luego por secuencia.

F:crates/arxi-store/src/memory.rs L124-L180 F:crates/arxi-store/src/memory.rs L317-L407


SQLite Backend

SqliteStore dirige todas las operaciones de la base de datos a través de un hilo de conexión dedicado (SqliteConnection) para preservar de manera segura la semántica de un solo escritor entre los llamadores asíncronos. F:crates/arxi-store/src/sqlite/mod.rs L12-L22 F:crates/arxi-store/src/sqlite/connection.rs L12-L21

SqliteConnection::execute utiliza sync_channel acotados + canales oneshot para conectar código asíncrono con operaciones síncronas de rusqlite. La admisión en la cola es explícita: la saturación de la cola falla cerrada con StoreError::ConcurrencyConflict en lugar de permitir un crecimiento ilimitado del trabajo en memoria. F:crates/arxi-store/src/sqlite/connection.rs L42-L136 F:crates/arxi-store/src/sqlite/connection.rs L167-L222

SqliteStore expone además ayudantes de metadatos tipados sobre store_meta (get_meta, set_meta, set_meta_batch) para el estado de tiempo de ejecución determinista, como marcadores de idempotencia para la rotación de claves de firmante. F:crates/arxi-store/src/sqlite/mod.rs


Esquema de SQLite e Indexación

La inicialización habilita:

  • modo WAL,
  • claves foráneas,
  • tabla de metadatos del esquema,
  • segmentos normalizados, sobres, adjuntos y tablas de unión,
  • índices para patrones de consulta de sobre/envelope y segmento determinísticos.

F:crates/arxi-store/src/sqlite/schema.rs L111-L144 F:crates/arxi-store/src/sqlite/schema.rs L43-L105


Cumplimiento de la Continuidad de la Cadena

Ambos backends imponen la validación de cadenas en el tiempo de anexado utilizando la recomputación de la cabeza de cadena esperada y la comparación en tiempo constante.

Validación de anexos en memoria: F:crates/arxi-store/src/memory.rs L140-L158

La validación de anexos de SQLite está limitada al ámbito de la transacción:

  1. verificar que el segmento exista y esté abierto,
  2. recalcular el hash de cadena esperado,
  3. rechazar desajuste,
  4. insertar filas de sobre + adjunto de sobre,
  5. actualizar los metadatos del segmento de forma atómica.

F:crates/arxi-store/src/sqlite/envelope_ops.rs L42-L141


Semántica de Consulta y Paginación

Las consultas de sobreenvoltura admiten filtrado de múltiples campos, además de continuación de cursor y límite. El orden de consulta de SQLite es ORDER BY segment_id, sequence; las consultas de segmento-sobreenvoltura se ordenan por sequence ASC.

F:crates/arxi-store/src/sqlite/envelope_ops.rs L167-L280 F:crates/arxi-store/src/sqlite/envelope_ops.rs L306-L347

La lista de segmentos admite filtros de estado/tiempo/id y ordena por created_at ASC. F:crates/arxi-store/src/sqlite/segment_ops.rs L148-L245


Corrupción y Manejo de Errores

StoreError diferencia explícitamente las interrupciones de integridad, los casos no encontrados, los conflictos de concurrencia, las fallas del backend y la detección de corrupción. F:crates/arxi-store/src/error.rs L36-L103

El análisis de segmentos de SQLite trata los valores de base de datos inválidos como corrupción (UUID inválido, estado desconocido, algoritmo de hash desconocido, marcas de tiempo inválidas). F:crates/arxi-store/src/sqlite/segment_ops.rs L336-L416

Las pruebas del sistema ahora validan el comportamiento de cierre en caso de fallo cuando las filas de SQLite persistidas son manipuladas con datos de UUID/genesis de segmento inválidos entre operaciones de CLI. F:system-tests/tests/suites/persistence.rs L375-L468


Referencia Cruzada Archivo por Archivo

ÁreaArchivoNotas
Contratos de almacenamientocrates/arxi-store/src/traits.rsInvariantes de rasgos de almacenamiento canónicos.
Tipos de segmentocrates/arxi-store/src/types.rsMetadatos de segmento y formas de filtro.
Backend en memoriacrates/arxi-store/src/memory.rsImplementación determinista basada en mapas.
Fachada de SQLitecrates/arxi-store/src/sqlite/mod.rsConstrucción de almacenamiento y composición de backend.
Ayudantes de metadatos de SQLitecrates/arxi-store/src/sqlite/mod.rsAyudantes de lectura/escritura store_meta para la persistencia del estado en tiempo de ejecución.
Puente de SQLitecrates/arxi-store/src/sqlite/connection.rsPuente asíncrono dedicado a hilos.
Esquema de SQLitecrates/arxi-store/src/sqlite/schema.rsDDL, índices, versionado de esquema.
Operaciones SQL de sobreenvolturacrates/arxi-store/src/sqlite/envelope_ops.rsLógica de consulta de apéndice y filtro transaccional.
Operaciones SQL de segmentocrates/arxi-store/src/sqlite/segment_ops.rsCiclo de vida del segmento y decodificación de metadatos.
Operaciones SQL de adjuntocrates/arxi-store/src/sqlite/attachment_ops.rsSemántica de put/get/exists dirigida por contenido.
Taxonomía de errorescrates/arxi-store/src/error.rsModelo de fallo de almacenamiento tipado.