Pokud vás zajímá pouze ext4 a ne ext3, pak bych před přejmenováním doporučil použít fsync na nový soubor. Výkon fsync na ext4 se zdá být mnohem lepší než na ext3 bez velmi dlouhých prodlev. Nebo to může být tím, že zpětný zápis je výchozí režim (alespoň na mém systému Linux).
Pokud vám záleží pouze na tom, aby byl soubor úplný a ne na tom, který soubor je v adresáři pojmenován, stačí nový soubor fsync. Není třeba fsyncovat adresář, protože bude ukazovat buď na nový soubor s úplnými daty, nebo na starý soubor.
Ne.
Podívejte se na libeatmydata a na tuto prezentaci:
Eat My Data:How Everybody Get File IO špatně
http://www.oscon.com/oscon2008/public/schedule/detail/3172
od Stewarta Smithe z MySql.
V případě, že je offline/už není k dispozici, ponechávám si jeho kopii:
- Video zde
- Snímky prezentace (online verze snímků)
Z dokumentace 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.
Soudě podle formulace "rozbité aplikace" je to rozhodně považováno za špatnou praxi vývojářů ext4, ale v praxi je to tak široce používaný přístup, že byl záplatován v samotném ext4.
Takže pokud vaše použití odpovídá vzoru, měli byste být v bezpečí.
Pokud ne, navrhuji, abyste místo vkládání fsync
prozkoumali dále tu a tam jen pro jistotu. Od fsync
to nemusí být tak dobrý nápad může být velkým zásahem do výkonu na ext3 (čtení).
Na druhou stranu, vyprázdnění před přejmenováním je správný způsob, jak provést nahrazení na nežurnálových souborových systémech. Možná to je důvod, proč ext4 zpočátku očekával toto chování od programů, auto_da_alloc
možnost byla přidána později jako oprava. Také tento patch ext3 pro režim zpětného zápisu (bez žurnálu) se snaží pomoci neopatrným programům tím, že při přejmenování asynchronně vyprázdní, aby se snížila šance na ztrátu dat.
Více o problému ext4 si můžete přečíst zde.