Jika Anda hanya peduli tentang ext4 dan bukan ext3 maka saya sarankan menggunakan fsync pada file baru sebelum melakukan penggantian nama. Performa fsync di ext4 tampaknya jauh lebih baik daripada di ext3 tanpa penundaan yang sangat lama. Atau mungkin fakta bahwa writeback adalah mode default (setidaknya di sistem Linux saya).
Jika Anda hanya peduli bahwa file tersebut lengkap dan bukan file mana yang disebutkan dalam direktori, maka Anda hanya perlu melakukan fsync file baru. Tidak perlu melakukan fsync direktori juga karena ini akan mengarah ke file baru dengan data lengkapnya, atau file lama.
Tidak.
Lihatlah libeatmydata, dan presentasi ini:
Eat My Data:Bagaimana Setiap Orang Mendapat File IO yang Salah
http://www.oscon.com/oscon2008/public/schedule/detail/3172
oleh Stewart Smith dari MySql.
Jika offline/tidak lagi tersedia, saya menyimpan salinannya:
- Videonya di sini
- Slide presentasi (slide versi online)
Dari dokumentasi 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.
Dilihat dari kata-kata "aplikasi rusak", ini pasti dianggap sebagai praktik buruk oleh pengembang ext4, tetapi dalam praktiknya pendekatan ini digunakan secara luas sehingga ditambal di ext4 itu sendiri.
Jadi, jika penggunaan Anda sesuai dengan polanya, Anda harus aman.
Jika tidak, saya sarankan Anda untuk menyelidiki lebih lanjut daripada memasukkan fsync
sana-sini hanya untuk aman. Itu mungkin bukan ide yang bagus sejak fsync
bisa menjadi hit kinerja utama di ext3 (baca).
Di sisi lain, pembilasan sebelum mengganti nama adalah cara yang benar untuk melakukan penggantian pada sistem file non-penjurnalan. Mungkin itu sebabnya ext4 pada awalnya mengharapkan perilaku ini dari program, auto_da_alloc
opsi ditambahkan kemudian sebagai perbaikan. Tambalan ext3 untuk mode writeback (non-jurnal) ini juga mencoba membantu program yang ceroboh dengan membilas secara asinkron saat mengganti nama untuk menurunkan kemungkinan kehilangan data.
Anda dapat membaca lebih lanjut tentang masalah ext4 di sini.