GNU/Linux >> Znalost Linux >  >> Linux

Je rename() bez fsync() bezpečné?

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.


Linux
  1. Je MV Atomic na Fs?

  2. Hromadné přejmenování souboru Bash pomocí čítače?

  3. Obnovit právě smazaný soubor na Ext4 pomocí Extundelete?

  1. Jak přejmenovat soubor v Linuxu?

  2. Přesunutí souboru v Linuxu v C

  3. Jak odstranit soubor bez použití rm?

  1. Přejmenujte soubor v terminálu Linux

  2. Přesouvání souborů na Linuxu bez mv

  3. Narození je na Ext4 prázdné?