inro

Transaccions

Escrit a partir de l'especificació de disseny del motor. El motor s'està implementant; això descriu el disseny, no una API publicada.

Un escriptor, lectors sense bloqueig

Un escriptor a la vegada, retingut per un mutex dins del procés. Els lectors mai bloquegen ni són bloquejats — un lector fixa una pàgina meta i llegeix l'arbre immutable que en penja.

Dos modes de sincronització:

  • Sync::Commit (per defecte): un fsync de pàgines i un de la pàgina meta per commit. Pèrdua màxima en cas de fallada: el commit en curs.

  • Sync::Interval(d): agrupa les sincronitzacions. Pèrdua màxima: els commits dins de l'última finestra d. Pensat per a IoT, on sincronitzar en cada escriptura desgasta la memòria flash.

Cap dels dos modes pot produir corrupció, perquè les dades vives mai se sobreescriuen.

El commit és la meta

Fer commit d'una transacció és escriure una pàgina meta. Tot el que ha canviat — l'arbre, la llista lliure, el catàleg — ja és al disc en aquell punt; l'escriptura de la meta és el que ho fa visible.

Recuperació

No hi ha cap procediment de recuperació a executar: cap WAL a reproduir, cap cua de log a escanejar. Obrir un fitxer costa tres lectures — la capçalera i les dues pàgines meta — a cost constant sense importar si el fitxer pesa 30 KB o 2 GB. Això és el que fa viable obrir cinc mil bases de dades en arrencar el servidor.

La recuperació després d'una fallada és aquesta mateixa obertura, amb un pas extra: es llegeixen els dos slots meta, es descarta el que falla la validació, i es munta el que té el txn_id vàlid més alt. Si la fallada va passar mentre s'escrivia una meta, aquell slot és el que falla la validació, així que es munta l'altre — l'última meta que va acabar d'escriure's — en el seu lloc: es perd el commit en curs, res no es corromp.

Hi ha un detall que sí que necessita atenció. Les pàgines que va escriure una transacció interrompuda queden assignades però sense referència des de cap meta — són fugues, no corrupció. Es detecten en obrir perquè el n_pages de la meta supervivent és més petit que la mida real del fitxer, i aquestes pàgines es retornen a la llista lliure. Sense aquest pas, el fitxer creixeria una mica amb cada fallada.

Sense WAL, sense fitxers satèl·lit: aquí la recuperació és una propietat de l'esquema de dues pàgines meta, no un mecanisme apart afegit després.