Desafortunadamente la respuesta de Dave es incorrecta.
Es posible que no todos los sistemas POSIX tengan un almacenamiento duradero. Y si lo hacen, todavía se "permite" que se humedezcan las mangueras después de un bloqueo del sistema. Para esos sistemas, una fsync no operativa() tiene sentido, y dicha fsync() está explícitamente permitida en POSIX. También es legal que el archivo sea recuperable en el directorio anterior, en el nuevo directorio, en ambos o en cualquier otra ubicación. POSIX no garantiza las fallas del sistema o las recuperaciones del sistema de archivos.
La verdadera pregunta debería ser:
cómo hacer un cambio de nombre duradera en los sistemas que apoyan que a través de la API POSIX?
que tiene que hacer un fsync() en ambos, la fuente y directorio de destino, debido a que el mínimo los fsync se supone (s) que hacer es persistir cómo directorio de origen o de destino debe ser similar.
¿Una fsync (destdirfd) también fsync implícitamente el directorio de origen?
- POSIX en general: no, nada implica que
- ext3/4: No estoy seguro de si ambos cambios a la fuente y el destino dir terminan en la misma transacción en la revista. Si lo hacen, ambos se comprometen juntos.
O puede que terminar con el archivo aparecer en ambos directorios después de un ciclo de potencia (“crash”), es decir que es imposible garantizar una operación de movimiento de forma duradera atómica?
- POSIX en general: no hay garantías, pero se supone que fsync() ambos directorios, que podrían no ser atómica duradera
- ext3/4: la cantidad de fsync() que mínimamente necesita depende de las opciones de montaje. P.ej. si está montado con "dirsync", no necesita ninguno de esos dos fsync() s. A lo sumo necesitas ambos fsync() s, pero estoy casi seguro de que uno es suficiente (atómico-durable entonces).
Si fsync el directorio de origen en lugar del directorio de destino, ¿eso también fsync implícitamente el directorio de destino?
- POSIX: no
- ext3/4: Realmente creo que ambos terminan en la misma transacción, por lo que no importa cuál de ellos fsync()
- mayores núcleos ext3: (si no están en la misma transacción) alguna implementación no tan óptima hizo demasiada sincronización en fsync(), apuesto a que cometió cada transacción anterior. Y sí, una implementación normal primero lo vincularía al destino y luego lo eliminaría de la fuente. Por lo tanto, fsync (srcdirfd) también activaría el fsync() del destino.
- ext4/ext3 última: si no están en la misma transacción, que podría ser capaz de sincronizarlos de manera totalmente independiente (por lo que hacer ambas cosas)
¿Hay algunas herramientas de prueba/depuración/aprendizaje pertinente sobre la (inyectores de fallas, herramientas de introspección, sistemas de archivos simulados, etc.)?
Para un accidente real, no. Por cierto, una caída real va más allá del punto de vista del kernel. El hardware podría reordenar las escrituras (y no escribir todo), corrompiendo el sistema de archivos. Ext4 está mejor preparado contra esto, porque habilita las barries de escritura (opciones de montaje) de manera predeterminada (ext3 no) y puede detectar daños con sumas de verificación de diario (también una opción de montaje).
Y para aprender: descubra si ambos cambios están vinculados de algún modo en el diario. :-P
El razonamiento aquí es muy incorrecto. - La "atomicidad" de rename(), por ejemplo, se refiere a "newpath", debajo de la cual debe estar el archivo anterior (si hubo uno) o el archivo renombrado, sin estado intermedio (como lo ven otros procesos) . –
Robert lo señaló, el cambio de nombre es "atómico" con respecto a la asignación de un nuevo inodo a su nombre, ya sea que POSIX defina si los nuevos puntos de inode son o no borrados. – ArekBulski