GNU/Linux >> Tutoriales Linux >  >> Linux

¿Es seguro renombrar() sin fsync()?

Si solo le importa ext4 y no ext3, le recomiendo usar fsync en el nuevo archivo antes de cambiar el nombre. El rendimiento de fsync en ext4 parece ser mucho mejor que en ext3 sin los retrasos muy largos. O podría ser el hecho de que la reescritura es el modo predeterminado (al menos en mi sistema Linux).

Si solo le importa que el archivo esté completo y no qué archivo se nombra en el directorio, solo necesita fsync el nuevo archivo. No hay necesidad de sincronizar el directorio también, ya que apuntará al archivo nuevo con sus datos completos o al archivo antiguo.


No

Mire libeatmydata y esta presentación:

Comer mis datos:cómo todo el mundo se equivoca en el archivo IO

http://www.oscon.com/oscon2008/public/schedule/detail/3172

por Stewart Smith de MySql.

En caso de que esté fuera de línea/ya no esté disponible, guardo una copia:

  • El vídeo aquí
  • Las diapositivas de la presentación (versión en línea de las diapositivas)

De la documentación de ext4:

When mounting an ext4 filesystem, the following option are accepted:
(*) == default

auto_da_alloc(*)    Many broken applications don't use fsync() when 
noauto_da_alloc     replacing existing files via patterns such as
                    fd = open("foo.new")/write(fd,..)/close(fd)/
                    rename("foo.new", "foo"), or worse yet,
                    fd = open("foo", O_TRUNC)/write(fd,..)/close(fd).
                    If auto_da_alloc is enabled, ext4 will detect
                    the replace-via-rename and replace-via-truncate
                    patterns and force that any delayed allocation
                    blocks are allocated such that at the next
                    journal commit, in the default data=ordered
                    mode, the data blocks of the new file are forced
                    to disk before the rename() operation is
                    committed.  This provides roughly the same level
                    of guarantees as ext3, and avoids the
                    "zero-length" problem that can happen when a
                    system crashes before the delayed allocation
                    blocks are forced to disk.

A juzgar por la frase "aplicaciones rotas", definitivamente se considera una mala práctica por parte de los desarrolladores de ext4, pero en la práctica es un enfoque tan ampliamente utilizado que fue parcheado en ext4 mismo.

Entonces, si su uso se ajusta al patrón, debería estar seguro.

Si no es así, le sugiero que investigue más en lugar de insertar fsync aquí y allá sólo para estar seguro. Puede que no sea una buena idea desde fsync puede ser un gran golpe de rendimiento en ext3 (lectura).

Por otro lado, vaciar antes de cambiar el nombre es la forma correcta de realizar el reemplazo en sistemas de archivos que no están registrados en diario. Tal vez por eso ext4 al principio esperaba este comportamiento de los programas, el auto_da_alloc La opción se agregó más tarde como una solución. Además, este parche ext3 para el modo de reescritura (sin registro en diario) intenta ayudar a los programas descuidados mediante el vaciado asincrónico al cambiar el nombre para reducir la posibilidad de pérdida de datos.

Puede leer más sobre el problema de ext4 aquí.


Linux
  1. Sistemas de archivos Linux:Ext2 vs Ext3 vs Ext4

  2. Mover un archivo en Linux en C

  3. grep sin mostrar ruta/archivo:línea

  4. Eliminar archivo sin preguntar

  5. ¿Cómo eliminar un archivo sin usar rm?

Cómo ejecutar el comando Sudo sin contraseña

Cómo cambiar el nombre de un archivo (s) en Linux

[Consejos de Bash] Cambiar el nombre de los archivos sin escribir el nombre completo dos veces en Linux

Cómo cambiar el nombre de los archivos en Ubuntu 20.04

¿Recuperación de datos ext4?

Linux - Reemplazo de espacios en los nombres de archivo