История изменений
Исправление slovazap, (текущая версия) :
Как гарантировать, что текстовый файл не побьется при записи, в случае hard reset/poweroff/kernel panic/т.д.?
Никак, потому что, например, железо может накрыться сразу после успешной записи. С точки же зрения кода, который файл записывает, нужно:
- флашнуть буфферы, если таковые в коде используются (например,
fflush()
в случае stdio,std::flush
в плюсах, ничего если просто вызывалwrite()
) - вызвать
fsync()
проверив возвращаемое значние - закрыть дескриптор проверив возвращаемое
close()
значание
После этого ответственность переходит ядру и файловой системе.
В питоне я использую такой паттерн:
with open('foo', 'w') as filedesc:
# write to filedesc
filedesc.flush()
os.fsync(filedesc.fileno())
Какая файловая система устойчива к таким случаям. Встречал, что с ZFS под Linux были проблемы.
Должна быть любая, это её наипервейшая обязанность. Но в Linux большинство ФС кривые, особенно XFS, для которой официально документированное поведение - херить данные. А вот например ZFS на FreeBSD мы stress-тестили на эту тему, проблем не обнаружено. YMMV.
Исходная версия slovazap, :
Как гарантировать, что текстовый файл не побьется при записи, в случае hard reset/poweroff/kernel panic/т.д.?
Никак, потому что, например, железо может накрыться сразу после успешной записи. С точки же зрения кода, который файл записывает, нужно:
- флашнуть буфферы, если таковые в коде используются (например,
fflush()
в случае stdio,std::flush
в плюсах, ничего если просто вызывалwrite()
) - вызвать
fsync()
- закрыть дескриптор проверив что
close()
вернул 0
После этого ответственность переходит ядру и файловой системе.
В питоне я использую такой паттерн:
with open('foo', 'w') as filedesc:
# write to filedesc
filedesc.flush()
os.fsync(filedesc.fileno())
Какая файловая система устойчива к таким случаям. Встречал, что с ZFS под Linux были проблемы.
Должна быть любая, это её наипервейшая обязанность. Но в Linux большинство ФС кривые, особенно XFS, для которой официально документированное поведение - херить данные. А вот например ZFS на FreeBSD мы stress-тестили на эту тему, проблем не обнаружено. YMMV.