Безопасно ли использовать rename () без fsync ()?

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

26
задан Ivo Danihelka 17 September 2011 в 19:52
поделиться

2 ответа

Нет.

Посмотрите на libeatmydata и эту презентацию:

«Съешь мои данные: как каждый получает неверный файл ввода-вывода»

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

Стюарт Смит из MySql.

В случае, если он недоступен / больше не доступен, я сохраняю его копию:

27
ответ дан David Phillips 17 September 2011 в 19:52
поделиться

Из документации 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.

Судя по формулировке «испорченные приложения», разработчики ext4 определенно считают плохой практикой, но на практике это так широко используется. Подход, который был исправлен в самой ext4.

Так что, если ваше использование соответствует шаблону, вы должны быть в безопасности.

Если нет, я предлагаю вам продолжить расследование вместо того, чтобы вставлять fsync здесь и там, чтобы быть в безопасности. Это может быть не очень хорошей идеей, поскольку fsync может сильно повлиять на производительность в ext3 ( читать ).

С другой стороны, очистка перед переименованием является правильным способом замены файловых систем без журналирования. Может быть, поэтому ext4 сначала ожидала такого поведения от программ, опция auto_da_alloc была добавлена ​​позже как исправление. Также этот патч ext3 для режима обратной записи (без ведения журнала) пытается помочь неосторожным программам, асинхронно сбрасывая при переименовании, чтобы снизить вероятность потери данных.

Подробнее о проблеме ext4 можно прочитать здесь .

3
ответ дан user 17 September 2011 в 19:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: