GNU/Linux >> Tutoriels Linux >  >> Linux

Est-ce que rename() sans fsync() est sûr ?

Si vous ne vous souciez que d'ext4 et non d'ext3, je vous recommande d'utiliser fsync sur le nouveau fichier avant de renommer. Les performances de fsync sur ext4 semblent être bien meilleures que sur ext3 sans les très longs délais. Ou c'est peut-être le fait que l'écriture différée est le mode par défaut (du moins sur mon système Linux).

Si vous vous souciez seulement que le fichier soit complet et non quel fichier est nommé dans le répertoire, vous n'avez qu'à fsync le nouveau fichier. Il n'est pas non plus nécessaire de fsynchroniser le répertoire car il pointera soit vers le nouveau fichier avec ses données complètes, soit vers l'ancien fichier.


Non.

Regardez libeatmydata, et cette présentation :

Eat My Data :comment tout le monde se trompe en matière d'E/S de fichiers

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

par Stewart Smith de MySql.

Au cas où il serait hors ligne/plus disponible, j'en garde une copie :

  • La vidéo ici
  • Les diapositives de présentation (version en ligne des diapositives)

À partir de la documentation 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 en juger par le libellé "applications cassées", c'est définitivement considéré comme une mauvaise pratique par les développeurs ext4, mais en pratique, c'est une approche si largement utilisée qu'elle a été corrigée dans ext4 lui-même.

Donc, si votre utilisation correspond au modèle, vous devriez être en sécurité.

Sinon, je vous suggère d'approfondir vos recherches au lieu d'insérer fsync ici et là juste pour être en sécurité. Ce n'est peut-être pas une si bonne idée depuis fsync peut être un impact majeur sur les performances sur ext3 (lecture).

D'un autre côté, le vidage avant le renommage est la bonne façon d'effectuer le remplacement sur les systèmes de fichiers non journalisés. C'est peut-être pourquoi ext4 s'attendait au début à ce comportement des programmes, le auto_da_alloc l'option a été ajoutée plus tard en tant que correctif. De plus, ce correctif ext3 pour le mode d'écriture différée (sans journalisation) tente d'aider les programmes négligents en vidant de manière asynchrone lors du changement de nom afin de réduire les risques de perte de données.

Vous pouvez en savoir plus sur le problème ext4 ici.


Linux
  1. La naissance est vide sur Ext4 ?

  2. Est-ce que Mv Atomic est sur le F?

  3. Renommer en masse le fichier Bash avec compteur ?

  4. Mv écrase le fichier en lecture seule sans invite ?

  5. Récupérer un fichier juste supprimé sur Ext4 avec Extundelete ?

Comment exécuter la commande Sudo sans mot de passe

Comment renommer un ou plusieurs fichiers sous Linux

[Bash Tips] Renommer les fichiers sans taper deux fois le nom complet sous Linux

Comment renommer des fichiers dans Ubuntu 20.04

Récupération de données Ext4 ?

Systèmes de fichiers Linux :Ext2 contre Ext3 contre Ext4