Как надежно переименовать файл в POSIX?

Как правильно переименовать файл в файловой системе POSIX? Конкретно интересно про fsyncs в каталогах . (Если это зависит от OS / FS, я спрашиваю о Linux и ext3 / ext4.)

Примечание : есть и другие вопросы по StackOverflow о надежных переименованиях, но, AFAICT, они не обращаются к fsync для каталогов (что для меня важно - я даже не изменяю данные файлов).

В настоящее время у меня есть (на Python) :

dstdirfd = open(dstdirpath, O_DIRECTORY|O_RDONLY)
rename(srcdirpath + '/' + filename, dstdirpath + '/' + filename)
fsync(dstdirfd)

Конкретные вопросы :

  • Это также неявно выполняет синхронизацию с исходным каталогом? Или я могу закончить тем, что файл появится в обоих каталогах после выключения питания (это означает, что мне придется проверить количество жестких ссылок и вручную выполнить восстановление), то есть невозможно гарантировать длительную операцию атомарного перемещения?
  • Если Я fsync исходный каталог вместо целевой каталог, будет ли это также неявно fsync целевой каталог?
  • Существуют ли какие-либо полезные связанные инструменты тестирования / отладки / обучения (инжекторы ошибок, инструменты самоанализа, имитирующие файловые системы, и т.п. )?

Заранее спасибо.

18
задан Yang 13 April 2011 в 05:09
поделиться