E/S atómica y transaccional con libjio
Alberto Bertogli
(albertogli@telpin.com.ar)
17/Julio/2004
(page 1)
Escrituras
- Asincrónicas
- Page Cache / Writeback
- HD Write Caching
- Sincrónicas
- Velocidad - Tiempo de búsqueda
- Garantías a nivel filesystem
- Concurrencia
- Escrituras solapadas
- File locks
- Fallas inesperadas
- Interrupciones abruptas
- Corrupción de archivos
- Tiempos de recuperación
(page 2)
Atomicidad
- Operaciones indivisibles
- Necesaria para sistemas confiables
- MTAs, DBs, embebidos, etc.
- Garantías existentes en los filesystems POSIX
- No hay operaciones atómicas
- No hay estandarización
- No hay garantías de ordenamiento
- Si hay fsync()
(page 3)
Transacciones
- Agrupamiento ordenado de operaciones
- Commit
- Rollback
- Garantías transaccionales (ACID)
- Atomicidad
- Consistencia
- Aislamiento
- Durabilidad
(page 4)
libjio
- En userspace
- Transacciones atómicas de E/S
- Permite trabajo concurrente
- Locks de escritura y lectura diferenciados
- Bajos tiempos de recuperación
- Portable e independiente del filesystem
- Embebible (aprox. 9k)
- APIs similares a UNIX y a ANSI I/O
(page 5)
Formato en el disco
- Archivo original intacto
- Directorio de journal
- Un archivo por cada transacción en curso
- Header principal
- Operaciones (header de op. + datos)
- Checksum
(page 6)
Commit
- Bloquear las porciones del archivo donde se va a trabajar
- Crear el archivo de transacción
- Leer los datos que están actualmente en el archivo
- Escribir los datos en el archivo de transacción
- Escribir los datos al archivo
- Marcar la transacción como aplicada
- Borrar el archivo de transacción
- Desbloquear las porciones bloqueadas al principio
jtrans_init(file, trans);
jtrans_add(trans, buf, len, offset);
...
jtrans_commit(trans);
(page 7)
Rollback
- Crear una nueva transacción igual a la que queremos deshacer
- Intercambiar los datos previos con los nuevos
- Hacer un commit de la nueva transacción
jtrans_rollback(trans);
(page 8)
Recuperación ante fallas
- "Camina" el directorio de journal
- Verifica la integridad de las transacciones
- Reaplica las transacciones completas
- Limpia el journal
jfsck(filename, result);
jfsck_cleanup(filename);
(page 9)
Transacciones "vagas"
- Utilizan el cache del OS
- Realizan solo una escritura sincrónica
- Las escrituras fisicas al archivo real son diferidas
- Mejor performance
- Mayor tiempo de recuperación
- Mayor espacio en disco
(page 10)
API
jopen(); jclose(); jsync();
jtrans_init(); jtrans_free();
jtrans_add(); jtrans_commit(); jtrans_rollback();
jread(); jwrite();
jreadv(); jwritev();
jpread(); jpwrite();
jtruncate();
jfsck(); jfsck_cleanup();
(page 11)