que descargar caracteristicas directory posix rename ext4 fsync

directory - descargar - posix que es



¿Cómo cambiar de forma duradera un archivo en POSIX? (4)

¿Cuál es la forma correcta de renombrar de forma duradera un archivo en un sistema de archivos POSIX? Específicamente preguntándose acerca de fsyncs en los directorios . (Si esto depende del sistema operativo / FS, estoy preguntando acerca de Linux y ext3 / ext4).

Nota : hay otras preguntas en StackOverflow acerca de los nombres duraderos, pero AFAICT no abordan la sincronización de los directorios (que es lo que me importa, ni siquiera estoy modificando los datos del archivo).

Actualmente tengo (en Python):

dstdirfd = open(dstdirpath, O_DIRECTORY|O_RDONLY) rename(srcdirpath + ''/'' + filename, dstdirpath + ''/'' + filename) fsync(dstdirfd)

Preguntas específicas :

  • ¿Esto también implícitamente fsync el directorio de origen? ¿O podría terminar con el archivo que aparece en ambos directorios después de un ciclo de alimentación (lo que significa que tengo que verificar el recuento del enlace físico y realizar la recuperación manualmente), es decir, es imposible garantizar una operación de movimiento atómico duradero?
  • Si fsync el directorio de origen en lugar del directorio de destino, ¿eso también fsync implícitamente el directorio de destino?
  • ¿Existen herramientas útiles de prueba / depuración / aprendizaje relacionadas (inyectores de fallas, herramientas de introspección, sistemas de archivos simulados, etc.)?

Gracias por adelantado.


La respuesta a su pregunta dependerá en gran medida del sistema operativo específico que se utilice, el tipo de sistema de archivos que se utilice y si la fuente y el destino están en el mismo dispositivo o no.

Comenzaría por leer la página del manual de rename (2) en la plataforma que estás usando.


Me parece que estás intentando hacer el trabajo del sistema de archivos. Si mueve un archivo, el kernel y el sistema de archivos son responsables de la operación atómica y la recuperación de fallas, no de su código.

De todos modos, este artículo parece abordar sus preguntas relacionadas con fsync: http://blogs.gnome.org/alexl/2009/03/16/ext4-vs-fsync-my-take/


POSIX define que la función de cambio de nombre debe ser atómica .

Entonces, si cambia el nombre (A, B), en ningún caso debería ver un estado con el archivo en ambos directorios o en ninguno de los directorios. Siempre habrá exactamente uno, independientemente de lo que haga con fsync () o si el sistema se bloquea.

Pero eso no resuelve el problema de asegurarse de que la operación de cambio de nombre () sea duradera. POSIX responde a esta pregunta :

Si se define _POSIX_SYNCHRONIZED_IO, la función fsync () forzará todas las operaciones de E / S actualmente en cola asociadas con el archivo indicado por el descriptor de archivo y el estado de finalización de E / S sincronizadas. Todas las operaciones de E / S se completarán según lo definido para la finalización de la integridad del archivo de E / S sincronizada.

Por lo tanto, si fsync () un directorio, las operaciones de cambio de nombre pendientes deben transferirse al disco en el momento en que este vuelva. fsync () de cualquiera de los directorios debería ser suficiente porque la atomicidad de la operación rename () requeriría que los cambios de ambos directorios se sincronizaran de forma atómica.

Finalmente, en contraste con la afirmación en la publicación del blog mencionada en otra respuesta, la razón para esto explica lo siguiente:

La función fsync () está diseñada para forzar una escritura física de datos desde la memoria caché del búfer, y para asegurar que después de un fallo del sistema u otra falla, todos los datos hasta el momento de la llamada fsync () se graben en el disco. Como los conceptos de "caché de búfer", "bloqueo del sistema", "escritura física" y "almacenamiento no volátil" no están definidos aquí, la redacción debe ser más abstracta.

Un sistema que afirmaba ser compatible con POSIX y que lo consideraba correcto comportamiento (es decir, no un error o falla de hardware) para completar un fsync () y no persistir esos cambios a través de una falla del sistema tendría que ser tergiversado deliberadamente con respecto a la especificación .

(actualizado con información adicional acerca de: comportamiento específico de Linux vs. comportamiento portátil)


Desafortunadamente la respuesta de Dave es incorrecta.

No todos los sistemas POSIX pueden tener un almacenamiento duradero. Y si lo hacen, todavía está "permitido" que se coloque después de una caída del sistema. Para esos sistemas, no tiene sentido fsync () tiene sentido, y dicho fsync () está explícitamente permitido bajo POSIX. También es legal que el archivo sea recuperable en el directorio anterior, el directorio nuevo, ambos o cualquier otra ubicación. POSIX no ofrece garantías de fallos del sistema ni de recuperación del sistema de archivos.

La verdadera pregunta debería ser:

¿Cómo hacer un cambio de nombre duradero en los sistemas que lo admiten a través de la API POSIX?

Debe hacer un fsync () tanto en el directorio de origen como en el de destino, porque el mínimo que se supone que deben hacer esos fsync () es cómo debe ser el directorio de origen o destino.

¿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 en el origen y en el directorio de destino terminan en la misma transacción en el diario. Si lo hacen, se comprometen a los dos juntos.

¿O podría terminar con el archivo que aparece en ambos directorios después de un ciclo de alimentación ("caída"), es decir, es imposible garantizar una operación de movimiento atómico duradero?

  • POSIX en general: no hay garantías, pero se supone que debe fsync () ambos directorios, lo que podría no ser atómico duradero
  • ext3 / 4: la cantidad de fsync () que necesita mínimamente depende de las opciones de montaje. Por ejemplo, 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-duradero 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, así que no importa cuál de ellos fsync ()
  • kernels más antiguos 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ó todas las transacciones que vinieron antes. Y sí, una implementación normal primero lo vincularía al destino y luego lo eliminaría del origen. Así que fsync (srcdirfd) también activaría fsync () del destino.
  • ext4 / latest ext3: si no están en la misma transacción, es posible que puedas sincronizarlos completamente de forma independiente (haz ambos)

¿Existen herramientas útiles de prueba / depuración / aprendizaje relacionadas (inyectores de fallas, herramientas de introspección, sistemas de archivos simulados, etc.)?

Para un choque real, no. Por cierto, un choque real va más allá del punto de vista del kernel. El hardware puede reordenar las escrituras (y no escribir todo), corrompiendo el sistema de archivos. Ext4 está mejor preparado para esto, porque habilita las restricciones de escritura (opciones de montaje) de forma predeterminada (ext3 no) y puede detectar daños en las sumas de comprobación de diario (también una opción de montaje).

Y para aprender: ¡averigüe si ambos cambios están vinculados de alguna manera en la revista! :-PAG