inro

Fase uno: el núcleo

Pager, B+tree copy-on-write, free list, transacciones, índices secundarios y cifrado por página.

Pager

La capa sobre la que se apoya todo lo demás: páginas de tamaño fijo leídas y escritas por número, con la cabecera y los dos meta slots alternos encima. Nada por encima del pager sabe cómo llega una página a disco.

B+tree copy-on-write y free list

Una página modificada se escribe en un hueco libre, nunca sobre datos vivos, y un commit es una única escritura de meta page. La free list que hace esto asequible también se escribe: las páginas que libera una transacción van a una lista pendiente etiquetada con el txn_id que las liberó, y pasan a la cabeza reutilizable en cuanto el lector activo más antiguo ha avanzado más allá de ese id.

file1. read page2. write copy into a free slot3. commit = new metapagecopymeta
Un commit libera la página antigua en lugar de borrarla; vuelve a la free list para reutilizarse.

Transacciones

Un único escritor retenido por un mutex en el proceso, lectores que nunca bloquean ni son bloqueados. Un lector fija una meta page y lee el árbol inmutable que cuelga de ella — no hay ningún procedimiento de recuperación que ejecutar, solo tres lecturas al abrir: la cabecera y los dos meta slots.

Catálogo e índices secundarios

Los índices se mantienen dentro de la misma transacción que los datos que indexan, mediante una función extractora registrada en un catálogo de una página. Eso es lo que compra la garantía de que un índice no puede desviarse de los datos a partir de los que se construyó.

delete_range

El borrado por rango sobre un rango de claves contiguo desengancha subárboles enteros sin leer sus hojas: se recorren los nodos internos, sus punteros a hijos se vuelcan a la free list en bloque, y el coste se mantiene proporcional al número de páginas internas, no al número de entradas borradas.

Cifrado por página

Opcional, autenticado, fijado en la creación del fichero. El nonce se deriva en lugar de almacenarse, y se construye a partir de un contador monótono de escrituras de página independiente del id de transacción — no del propio txn_id — de modo que el ciclo de vida de una transacción, por mucho que dure, no pueda hacer que un nonce se repita.


Esto es lo que la fase 1 ha escrito hasta ahora, no una API pública ni una fecha de lanzamiento. inro sigue en la fase 1.