К сожалению, ответ Дейва неверен.
Не все системы POSIX могут даже иметь долговременное хранилище.И если они это сделают, то после «сбоя системы» он все еще «разрешен».Для этих систем функция no-op fsync () имеет смысл, и такая функция fsync () явно разрешена в POSIX.Также допустимо восстановление файла в старом каталоге, в новом каталоге или в любом другом месте.POSIX не дает никаких гарантий для сбоев системы или восстановления файловой системы.
Реальный вопрос должен быть следующим:
Как сделать надежное переименование в системах, которые поддерживают это через API POSIX?
Вам нужно выполнить fsync () для обоих, каталог-источник и , потому что минимум, который эти fsync () должны сделать, это сохранить, как каталог-источник или каталог-адресатвыглядит как.
fsync (destdirfd) также неявно fsync каталог с исходным кодом?
- POSIX в целом: нет, ничего не значит, что
- ext3 / 4: я не уверен, что оба изменения в исходном и целевом каталогах окажутся в одной транзакции в журнале.Если они это сделают, они оба будут зафиксированы вместе.
Или я мог бы в конечном итоге получить файл, отображающийся в обоих каталогах после цикла питания («сбой»), то есть невозможно гарантироватьдлительное атомарное перемещение?
- POSIX в целом: никаких гарантий, но вы должны fsync () оба каталога, которые не могут быть атомарно долговечными
- ext3 / 4: насколько минимально необходим fsync (), зависит от параметров монтирования.Например, если смонтирована с помощью «dirsync», вам не нужен ни один из этих двух fsync ().В лучшем случае вам нужны оба fsync (), но я почти уверен, что одного достаточно (тогда атомарно-долговечный).
Если я fsync вместо исходного каталога, fsync,Будет ли это также неявно fsync каталог назначения?
- POSIX: нет
- ext3 / 4: я действительно считаю, что оба в конечном итоге в одной транзакции, так что это ненезависимо от того, какую из них вы используете fsync ()
- старых ядер ext3: (если они не находятся в одной и той же транзакции) некоторая неоптимальная реализация слишком сильно синхронизировалась с fsync (), держу парисовершить каждую транзакцию, которая произошла раньше.И да, нормальная реализация сначала связывает его с пунктом назначения, а затем удаляет его из источника.Таким образом, fsync (srcdirfd) также будет запускать функцию fsync () пункта назначения.
- ext4 / latest ext3: если они не находятся в одной транзакции, вы можете полностью синхронизировать их независимо (так чтосделать и то, и другое)
Существуют ли какие-либо полезные инструменты для тестирования / отладки / обучения (инжекторы ошибок, инструменты самоанализа, фиктивные файловые системы и т. д.)?
Длянастоящая авария, нет.Кстати, настоящий сбой выходит за рамки ядра.Аппаратное обеспечение может изменить порядок записи (и не записать все), повреждая файловую систему.Ext4 лучше подготовлен к этому, потому что он разрешает запрет записи (параметры монтирования) по умолчанию (ext3 не делает) и может обнаружить повреждение с помощью контрольных сумм журнала (также опция монтирования).
И для изучения: выясните, еслиоба изменения как-то связаны в журнале!: -Р