GNU/Linux >> Linux Esercitazione >  >> Linux

Rename() senza fsync() è sicuro?

Se ti interessa solo ext4 e non ext3, ti consiglio di utilizzare fsync sul nuovo file prima di eseguire la ridenominazione. Le prestazioni di fsync su ext4 sembrano essere molto migliori rispetto a ext3 senza ritardi molto lunghi. Oppure potrebbe essere il fatto che il writeback è la modalità predefinita (almeno sul mio sistema Linux).

Se ti interessa solo che il file sia completo e non quale file sia nominato nella directory, devi solo fsync il nuovo file. Non c'è bisogno di sincronizzare anche la directory poiché punterà al nuovo file con i suoi dati completi o al vecchio file.


No.

Guarda libeatmydata e questa presentazione:

Mangia i miei dati:come tutti sbagliano l'IO dei file

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

di Stewart Smith di MySql.

Nel caso in cui sia offline/non più disponibile, ne conservo una copia:

  • Il video qui
  • Le diapositive della presentazione (versione online delle diapositive)

Dalla documentazione 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 giudicare dalla dicitura "applicazioni danneggiate", è sicuramente considerata una cattiva pratica dagli sviluppatori di ext4, ma in pratica è un approccio così ampiamente utilizzato che è stato patchato nello stesso ext4.

Quindi, se il tuo utilizzo si adatta allo schema, dovresti essere al sicuro.

In caso contrario, ti suggerisco di indagare ulteriormente invece di inserire fsync qua e là solo per essere al sicuro. Potrebbe non essere una buona idea dal fsync può essere un grande successo in termini di prestazioni su ext3 (leggi).

D'altra parte, lo svuotamento prima della ridenominazione è il modo corretto per eseguire la sostituzione su file system senza journaling. Forse è per questo che ext4 all'inizio si aspettava questo comportamento dai programmi, il auto_da_alloc l'opzione è stata aggiunta in seguito come correzione. Anche questa patch ext3 per la modalità writeback (senza journaling) cerca di aiutare i programmi disattenti scaricando in modo asincrono durante la ridenominazione per ridurre la possibilità di perdita di dati.

Puoi leggere di più sul problema ext4 qui.


Linux
  1. Rinominare un file nel terminale Linux

  2. Mv Atomic è sulle F?

  3. Rinomina di massa del file Bash con contatore?

  4. Annullare l'eliminazione di un file appena eliminato su Ext4 con Extundelete?

  5. Come rinominare un file in Linux?

Come eseguire il comando Sudo senza password

Come rinominare uno o più file in Linux

[Suggerimenti Bash] Rinomina i file senza digitare il nome completo due volte in Linux

Come rinominare i file in Ubuntu 20.04

Recupero dati Ext4?

Come rimuovere un file senza usare rm?