LINUX.ORG.RU
ФорумTalks

Линус Торвальдс выступил с критикой дизайна файловых систем


0

0

В виду последних событий, когда многие люди обнаружили пропадание и обнуление файлов в файловой системе ext4 после краха ОС, создатели ext4 высказались за идею включения в ядро новых системных вызовов, которые бы позволили безопасно работать с файлами.

Линус Торвальдс в списке рассылки ядра жестоко раскритиковал эти предложения и заявил, что большинство программистов никогда не будут этими новыми системными вызовами пользоваться, что они будут не стабильными и плохо оттестированными.

Цитата: "Поэтому вместо того, чтобы придумывать новые препятствия, которые никто не будет использовать, разработчики файловых систем должны нацеливаться на плохой "лишь бы работал" код, до тех пор пока не случилась самое большое несчастье. Потому что, хотите вы этого или нет, 99% программ именно так и написаны.

Неоспоримый ФАКТ того, что люди не проверяют ошибки, которые возвращает системный вызов close() (закрытие файла и сброс "грязных" данных из кэша на диск) должен означать, что, например, при отложенной записи на диск нужно обязательно проверять ситуацию переполнения диска. Если ваша файловая система возвращает результат ENOSPC при закрытии файла, вы просто теряете покрытие ошибкой состояния нехватки места для 90% приложений. Вот так всё просто.

Жаловаться на то, что это ошибка в приложении, это всё равно что жаловаться на скорость света: вы должны решать это проблему имея прямое отношение к реалиям мира, а не так, как вам кажется, эти реалии должны быть. Тоже самое относится к "люди должны писать во временный файл, вызывать метод fsync для него и переименовывать его вместо оригинала". Вы думаете, что так должно быть, но в реалии программисты пишут open(filename, O_TRUNC | O_CREAT, 0666). Жёсто <и не правильно>, я знаю. Но в конечном итоге, даже разработчики хорошо написанного приложения могут решать что fsync() не стоит тех потерей в производительности. В git, например, где мы пытаемся быть очень очень очень (sic!) аккуратными, fsync() по умолчанию выключен.

Почему? Потому что его включение вызывает неприемлемое поведение ext3. Сейчас, надо сказать, дизайн git'a означает, что потерянная новая база данных не является мёртвой, но потенциально это очень очень беспокоит и смущает - вам, возможно, придётся откатить назад и переделать некоторые операции вручную, и вы должны достаточно знать изначально, чтобы сделать это.

Так о чём я говорю? Иногда те разработчики файловых систем, которые говорят "вы должны использовать fsync(), чтобы получить предсказуемые результаты" - это те же люди, которые испортили всё это до такого безобразия, что fsync'ом абсолютно нереалистично пользоваться.

Теория и практика иногда сталкиваются. Когда это случается, теория проигрывает. Всегда."

http://www.opennet.ru/opennews/art.shtml?num=20944

birdie теперь там зажигает :)

Lumi ★★★★★
()

Промт теперь настолько крутой, или переводил школьник с двойками по русскому и английскому?

redgremlin ★★★★★
()
Ответ на: комментарий от redgremlin

> Промт теперь настолько крутой, или переводил школьник с двойками по русскому и английскому?

Не знаешь, чем birdie переводит?

Lumi ★★★★★
()
Ответ на: комментарий от GAMer

> Шеф, а что же нам теперь делать то?

mount / -o remount,sync

Lumi ★★★★★
()

Очень правильно говорит.

Буду давать эту ссылку всем начинающим (и не очень начинающим) программистам. Ибо это вечная проблема, когда говорят что-то вроде "мне пофигу что моя программа не работает в реальных условиях, ибо в теории, если все будут делать так и так, всё будет ок - и меня не волнует что в таком случае использование моей программы становится бессмысленным".

aix27249
()

> Так о чём я говорю?

Да, Уолтер, о чем ты?

a3
()

я бы убивал за fsync().

мне на новый винт каждые пол года денег жалко.

scaldov ★★
()
Ответ на: комментарий от stave

Когда линус говорит о чисто технических вещах, он бывает прав. just for change, you know;)

svu ★★★★★
()

Можите объяснить, почему несмотря на активое использование торрентов и многократного отключения в последнее время света у меня ничего не слетало?

linux4ever
()

Ну что теперь в ядре объявить поддержку ext4 как [new] [unstable]
и отключить по дефолту? =)

Lucky1 ★★★
()

Линус прав ... я бы и из существующих системных вызовов половину выкинул.

P.S.: Никогда не пользовался ext3/4

robot12 ★★★★★
()

> Неоспоримый ФАКТ того, что люди не проверяют ошибки, которые возвращает системный вызов close() (закрытие файла и сброс "грязных" данных из кэша на диск) должен означать, что, например, при отложенной записи на диск нужно обязательно проверять ситуацию переполнения диска. Если ваша файловая система возвращает результат ENOSPC при закрытии файла, вы просто теряете покрытие ошибкой состояния нехватки места для 90% приложений. Вот так всё просто.

А я ведь даже не задумывался об этом! Поставил себе на заметку...

Deleted
()

Думаю, что во всём виноваты производители железа. Пусть ставят в винты немного памяти (хотя она там и так есть) и батарейку, чтобы write-back кеширование винта переживало отключение питания. Тогда fsync() не будте так страшен.

mky ★★★★★
()
Ответ на: комментарий от Deleted

Возник оффтопичный вопрос. А CloseHandle в венде имеет то же поведение, что и close/fclose? А то MSDN и гугль ничего внятного сказать не могут.

Deleted
()
Ответ на: комментарий от Deleted

Какое поведение? В мсдн сказано:

If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero. To get extended error information, call GetLastError.

Так что в той самой GetLastError может быть и нехватка места на диске и всё, что с этим связано и не только это.

RomanU
()
Ответ на: комментарий от RomanU

> Так что в той самой GetLastError может быть и нехватка места на диске и всё, что с этим связано и не только это.

В man close и man fclose явно сказано, что они могут вызвать те же ошибки, что и fwrite/fsync, а в MSDN о подобном ни слова нет. А так то да, теоретически в GetLastError может быть что угодно.

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.