История изменений
Исправление Rootlexx, (текущая версия) :
Да в dpkg куча легаси и неудобных вещей, один только fsync() на все файлы при установке пакетов дделается лишь потому, что dpkg разрабатывался до изобретения журналируемых файловых систем, и за ~25 лет никто и не исправил его поведение.
Что? Без fsync()
не гарантируется завершённость записи содержимого файлов. Те же ext4 и btrfs страдали потерей данных из-за механизма отложенной аллокации. Сейчас как минимум в первой есть несколько эвристик, которые запускают запись данных при некоторых типичных условиях (например, если rename()
заменяет существующий файл, то происходит запись существующих отложенных аллокаций), но сами разработчики ext4 в лице Theodore Tso говорят, что эти механизмы существуют лишь для неправильно работающих приложений, что полагаться на них нельзя, и что приложения должны вызывать fsync()
.
И вообще, перекладывание здесь ответственности на dpkg — это с больной головы на здоровую. Проблема-то на самом деле в тормозной ext4, которая при вызове fsync(fd)
синхронизирует не только данные файла, соответствующего fd
, но и чуть ли не всех остальных файлов в системе, потому что журнал работает на уровне блоков, а не файлов. fast_commit должен помогать в этом случае.
Исходная версия Rootlexx, :
Да в dpkg куча легаси и неудобных вещей, один только fsync() на все файлы при установке пакетов дделается лишь потому, что dpkg разрабатывался до изобретения журналируемых файловых систем, и за ~25 лет никто и не исправил его поведение.
Что? Без fsync()
не гарантируется завершённость записи содержимого файлов. Те же ext4 и btrfs страдали потерей данных из-за механизма отложенной аллокации. Сейчас как минимум в первой есть несколько эвристик, которые запускают запись данных при некоторых типичных условиях (например, если rename()
заменяет существующий файл, то происходит запись существующих отложенных аллокаций), но сами разработчики ext4 в лице Theodore Tso говорят, что эти механизмы существуют лишь для неправильно работающих приложений, что полагаться на них нельзя, и что приложения должны вызывать fsync()
.