inro

Transacciones

Escrito a partir de la especificación de diseño del motor. El motor se está implementando; esto describe el diseño, no una API publicada.

Un escritor, lectores sin bloqueo

Un escritor a la vez, retenido por un mutex dentro del proceso. Los lectores nunca bloquean ni son bloqueados — un lector fija una página meta y lee el árbol inmutable que cuelga de ella.

Dos modos de sincronización:

  • Sync::Commit (por defecto): un fsync de páginas y uno de la página meta por commit. Pérdida máxima ante un fallo: el commit en curso.

  • Sync::Interval(d): agrupa las sincronizaciones. Pérdida máxima: los commits dentro de la última ventana d. Pensado para IoT, donde sincronizar en cada escritura desgasta la memoria flash.

Ningún modo puede producir corrupción, porque los datos vivos nunca se sobrescriben.

El commit es la meta

Hacer commit de una transacción es escribir una página meta. Todo lo que cambió — el árbol, la lista libre, el catálogo — ya está en disco llegado ese punto; la escritura de la meta es lo que lo hace visible.

Recuperación

No hay ningún procedimiento de recuperación que ejecutar: ningún WAL que reproducir, ninguna cola de log que escanear. Abrir un fichero cuesta tres lecturas — la cabecera y las dos páginas meta — a coste constante sin importar si el fichero pesa 30 KB o 2 GB. Eso es lo que hace viable abrir cinco mil bases de datos al arrancar el servidor.

La recuperación tras un fallo es esa misma apertura, con un paso extra: se leen ambos slots meta, se descarta el que falla la validación, y se monta el que tiene el txn_id válido más alto. Si el fallo ocurrió mientras se escribía una meta, ese slot es el que falla la validación, así que se monta el otro — la última meta que terminó de escribirse — en su lugar: se pierde el commit en curso, nada se corrompe.

Hay un detalle que sí necesita atención. Las páginas que escribió una transacción interrumpida quedan asignadas pero sin referencia desde ninguna meta — son fugas, no corrupción. Se detectan al abrir porque el n_pages de la meta superviviente es menor que el tamaño real del fichero, y esas páginas se devuelven a la lista libre. Sin este paso, el fichero crecería un poco con cada fallo.

Sin WAL, sin ficheros satélite: aquí la recuperación es una propiedad del esquema de dos páginas meta, no un mecanismo aparte añadido después.