История изменений
Исправление 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.