¿Cómo puedo verificar si mv
es atómico en mi fs (ext4)?
El sistema operativo es Red Hat Enterprise Linux Server versión 6.8.
En general, ¿cómo puedo verificar esto? Miré a mi alrededor y no encontré si mi sistema operativo es POSIX estándar.
¿Cómo puedo verificar si mv
es atómico en mi fs (ext4)?
El sistema operativo es Red Hat Enterprise Linux Server versión 6.8.
En general, ¿cómo puedo verificar esto? Miré a mi alrededor y no encontré si mi sistema operativo es POSIX estándar.
Respuestas:
Curiosamente, parece que la respuesta puede ser "depende".
Para que quede claro, mv
se especifica a
La
mv
utilidad realizará acciones equivalentes a larename()
función
La especificación de la función renombrar establece:
Esta
rename()
función es equivalente para archivos normales a la definida por el estándar ISO C. Su inclusión aquí amplía esa definición para incluir acciones en directorios y especifica el comportamiento cuando el nuevo parámetro nombra un archivo que ya existe. Esa especificación requiere que la acción de la función sea atómica.
Pero la última especificación ISO C para rename()
estados:
7.21.4.2 La
rename
funciónSinopsis
#include <stdio.h> int rename(const char *old, const char *new);
Descripción
La
rename
función hace que el archivo cuyo nombre es la cadena señalada porold
sea conocido en adelante por el nombre dado por la cadena señalada pornew
. El nombre del archivoold
ya no es accesible con ese nombre. Si un archivo nombrado por la cadena a la que apuntanew
existe antes de la llamada a larename
función, el comportamiento está definido por la implementación.Devoluciones
La
rename
función devuelve cero si la operación tiene éxito, no cero si falla, en cuyo caso si el archivo existía anteriormente, todavía se conoce por su nombre original.
Sorprendentemente, tenga en cuenta que no hay un requisito explícito para la atomicidad. Es posible que se requiera en otro lugar en el último estándar C disponible públicamente, pero no he podido encontrarlo. Si alguien puede encontrar ese requisito, las ediciones y los comentarios son más que bienvenidos.
Ver también ¿Es rename () atomic?
Según la página de manual de Linux :
Si
newpath
ya existe, será reemplazado atómicamente, de modo que no haya ningún punto en el que otro proceso que intente accedernewpath
lo encuentre perdido. Sin embargo, probablemente habrá una ventana en la que ambosoldpath
y senewpath
refieren al archivo que se renombra.
La página de manual de Linux afirma que el reemplazo del archivo será atómico.
Sin embargo, probar y verificar que la atomicidad podría ser muy difícil, si es así de lejos debe llegar. No tiene claro qué quiere decir con su uso de "¿Cómo puedo verificar si mv es atómico"? ¿Desea requisitos / especificaciones / documentación que sea atómica, o necesita realmente probarlo ?
Tenga en cuenta también que lo anterior supone que los dos nombres de archivo de operando están en el mismo sistema de archivos. No puedo encontrar ninguna restricción estándar en la mv
utilidad para hacer cumplir eso.
rename
atomicidad.
/
un ext4 fs y /tmp
un ext4 fs diferente, entonces no puede moverse atómicamente de uno a otro.
mv
se basa en la rename
llamada al sistema y rename()
es atómico. Podrías mirar la página del manual rename(2)
.
Podrías encontrar la respuesta en Is rename () atomic? en stackoverflow.
¿Qué tipo de fs usaste?
Además de verificar las llamadas al sistema y su atomicidad, quizás inotify-tools
pueda servir como prueba, aunque no estoy seguro de si es una prueba garantizada de atomicidad.
Abrir 2 conchas. Mire el directorio de destino del movimiento en uno de ellos:
inotifywait -m target/
Mueva un archivo al directorio en el otro:
mv foobar target/
El inotifywait
debería mostrar solo una línea:
target/ MOVED_TO foobar
Parece atómico en comparación con la respuesta a ls target/
y touch target/a
, que produce mensajes multilínea como:
# the response to ls target/
target/ OPEN,ISDIR
target/ ACCESS,ISDIR
target/ CLOSE_NOWRITE,CLOSE,ISDIR
PD
Creo que, al menos, muestra que la cooperación multiproceso asíncrona en archivos es segura con inotify
(prácticamente atómica): en cualquier caso, respondería solo después de inotify
dar la señal final después de la operación. Por ejemplo, una configuración de productor-consumidor se puede implementar de manera fácil y segura con inotify
.
strace
?