linux file-rename atomicity vfs

linux - ¿Es rename() atómico?



file-rename atomicity (3)

No estoy seguro de que la parte "básicamente" de su pregunta sea válida. A menos que tenga algún tipo de sincronización entre los dos, no importa cómo se cambie el nombre atómico. Si la copia del directorio llega antes del cambio de nombre, tendrá el archivo 1 en ambos lugares.

No estoy seguro de si se refería a subprocesos o procesos, pero si existen mecanismos de bloqueo para ambos, los bloqueos de subprocesos son, con mucho, los más simples porque no tienen que cruzar los límites del proceso.

No puedo verificar esto a través de experimentos y tampoco pude recopilarlo de las páginas de manual.

Digamos que tengo dos procesos, uno moviendo (renombrar) el archivo1 del directorio1 al directorio2. Supongamos que el otro proceso que se ejecuta copia simultáneamente los contenidos de directory1 y directory2 a otra ubicación. ¿Es posible que la copia se realice de manera que tanto el directorio1 como el directorio2 muestren el archivo1? Es decir, el directorio1 se copia antes del traslado y el directorio2 después del traslado mediante el primer proceso.

Básicamente es rename () es una llamada al sistema atómico?

Gracias


Si y no.

rename () es atómico asumiendo que el SO no falla. No puede ser dividido por ningún otro sistema de archivos op.

Si el sistema falla, es posible que vea una operación ln () en su lugar.

También tenga en cuenta que cuando opera en un sistema de archivos de red, puede obtener ENOENT cuando la operación se realizó con éxito. El sistema de archivos local no puede hacerte eso.


Esta es una respuesta muy tardía, pero ... sí rename() es atómico pero no en el sentido de tu pregunta. Bajo Linux, rename(2) dice:

Sin embargo, cuando se sobrescriba, probablemente habrá una ventana en la que tanto oldpath como newpath se refieren al archivo cuyo nombre se está cambiando.

Pero rename() sigue siendo atómico en un sentido muy importante: si lo usas para sobrescribir un archivo, terminarás con la versión anterior o la nueva y nada más.

[ actualización: pero como @ jonas-wielicki señala en los comentarios, debes asegurarte de que el archivo al que estás renombrando realmente tenga contenidos actualizados, usando fsync() y amigos.]

Si ya existe newpath, se reemplazará atómicamente (sujeto a algunas condiciones; consulte ERRORES a continuación), de modo que no haya ningún punto en el que otro proceso que intente acceder a newpath lo encuentre perdido.

Si ve ERRORES, encontrará que el cambio de nombre puede fallar, pero nunca romperá la atomicidad.

Todo esto es de la página del manual de Linux. Lo que no sé es si hace un rename() en un sistema de archivos de red donde el servidor ejecuta un sistema operativo diferente. ¿Tiene el cliente una esperanza en el infierno de garantizar la atomicidad entonces? Lo dudo.