Estado que sobrevive al reinicio
La relación entre lo que vive en memoria y lo que se escribe: cuándo se carga, cuándo se guarda, y las tres políticas de escritura con sus consecuencias cuando el proceso muere de golpe.
El ciclo
Las tres políticas
La regla que se deduce: lo que el usuario ha creado se escribe pronto; lo que la aplicación puede reconstruir, cuando convenga.
Y el aviso del nivel 11.4 vuelve aquí con más peso: el texto sin guardar no se persiste al cerrar, se persiste mientras se escribe. Al cerrar puede no haber ocasión, y ese es justo el momento en que importaría.
Escribir sin corromper
Escribir directamente sobre el fichero bueno tiene un fallo conocido: si el proceso muere a mitad, el fichero queda a medias, y a medias suele ser peor que viejo. Se ha perdido lo nuevo y además lo anterior.
El patrón que lo evita es de tres pasos y es el mismo desde hace décadas:
// escribir a un temporal, sincronizar, y mover encimalet tmp = destino.with_extension("tmp");{ let mut f = std::fs::File::create(&tmp)?; f.write_all(&datos)?; f.sync_all()?; // que llegue al disco de verdad, no a la caché}std::fs::rename(&tmp, destino)?; // el reemplazo es atómico en el mismo volumenLas tres piezas hacen falta: sin el temporal, el fichero bueno queda a medias; sin la sincronización, el sistema puede tener los datos en caché cuando llegue el apagón; y sin el renombrado —que es atómico en el mismo sistema de ficheros— no hay reemplazo instantáneo.
Con SQLite nada de esto hace falta: el motor ya lo resuelve con su propio registro. Es una de las razones de la fase VII para no inventar un formato propio cuando hay datos que importan.
Qué NO conviene persistir
Merece la lista, porque persistir de más produce estados imposibles al arrancar:
- Los trabajos en marcha. Guardar que había una importación al 60 % no sirve: al arrancar no hay tarea que continuar. Lo que sí se puede guardar es el punto para reanudar, y eso es la tercera política del nivel 21.3, que es otra cosa y cuesta más.
- Lo que se puede derivar. El aviso del nivel 22.1: un dato derivado guardado es un dato que se desincroniza.
- Cachés grandes, en el mismo sitio que los datos. Una caché va al directorio de caché —nivel 39— precisamente porque el sistema puede borrarla y no pasa nada.