Как правильно переименовать файл в файловой системе 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 целевой каталог?
- Существуют ли какие-либо полезные связанные инструменты тестирования / отладки / обучения (инжекторы ошибок, инструменты самоанализа, имитирующие файловые системы, и т.п. )?
Заранее спасибо.
задан Yang 13 April 2011 в 05:09
поделиться