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.