Гарантирует ли fsync родительского каталога синхронизацию метаданных всех рекурсивных подкаталогов?

В настоящее время я пишу приложение для Android, которое должно работать с большим количеством файлов на собственной стороне.

Недавно я столкнулся с несколькими проблемами потери данных или несоответствия при обновлении или переименовании этих файлов. (Все эти файлы хранятся в нескольких подкаталогах из общего родительского/корневого каталога.)

Прочитав несколько статей о fsync(), я решил использовать его. Однако мне было непонятно одно:

Гарантирует ли вызов fsync() в родительском каталоге рекурсивную синхронизацию метаданных всех подкаталогов?

То есть, скажем, я выполняю множество операций переименования нескольких файлов в разных подкаталогах в общем родительском каталоге.

Должен ли я вызывать fsync() для каждого подкаталога отдельно или вызова fsync() в моем родительском каталоге достаточно, чтобы убедиться, что метаданные всех подкаталогов (и их дочерних каталогов рекурсивно) синхронизированы с физическим устройством?

В основном идея состоит в том, чтобы сэкономить время, избегая нескольких вызовов fsync(). Или для fsync() в каталоге верхнего уровня потребуется больше времени, чем для fsync() в каждом отдельном подкаталоге? (Предполагая, что fysnc() в каталоге верхнего уровня синхронизирует все метаданные подкаталога)


person sdare    schedule 12.07.2013    source источник


Ответы (1)


Когда fsync вызывается для каталога, операция рассматривает свою цель скорее как файл, чем как контейнер файлов. С точки зрения файловой системы каталог — это файл особого типа, который просто содержит метаданные о других файлах. Когда fsync применяется к каталогу, эти метаданные о содержащихся файлах синхронизируются, но не сами подкаталоги/файлы.

Если вы хотите убедиться, что все содержимое синхронизировано должным образом, вы должны использовать fsync явно.

person tuckermi    schedule 12.07.2013