Долговечность записи между вызовами fsync()
Вызов fsync()
гарантирует, что данные записываются при любых завершенных вызовах write()
на один и тот же файл дескриптор долговечен, в том смысле, что он будет читабелен даже в случае сбоя системы и перезапуска.
Это также тот случай, когда последствия вызовов write()
могут быть переупорядочены по пути на диск, так что если вы не fsync()
тогда вы можете увидеть последствия более поздних звонков write()
но не раньше.
Насколько я понимаю, добавление в файл кажется достаточно безопасным даже между fsync()
звонки: после сбоя результирующий файл будет таким, каким был fsync()
Эд плюс, может быть, какая-то начальная подпоследовательность всего, что было написано Невозможно, чтобы файл содержал более поздние записи, а не более ранние, или содержал ненужные данные вместо чего-то фактически записанного (возможно, в зависимости от того, какую файловую систему вы используете и какие параметры вы выбрали, например, ext3
а также ext4
иметь data=ordered
против data=writeback
).
Что гораздо менее ясно, так это последствия сбоя при перезаписи некоторых блоков в середине файла. В таком случае возможно ли, что любое подмножество блоков будет перезаписано при чтении файла после сбоя? Если да, то есть ли способ безопасно обновить середину файла, или вам в основном приходится полагаться на журнал, доступный только для добавления, для долговечности?
Есть ли гарантии о write()
звонки, которые находятся в полете во время fsync()
звоните, или которые запускаются потом? Куда мне обратиться, чтобы узнать авторитетный источник этих гарантий?