Состояние гонки при перемещении файлов в Linux

Предположим, у меня есть два сценария. Первый помещает (с помощью команды mv) некоторые файлы в каталог, второй время от времени проверяет каталог и обрабатывает файлы. Меня беспокоит ситуация, когда второй скрипт начинает обработку файла, который на данный момент перемещен лишь частично. Может ли это произойти в реальной жизни в файловой системе XFS?


person nab    schedule 27.02.2012    source источник


Ответы (2)


Это зависит от того, откуда вы перемещаете файлы. mv ВНУТРИ одной файловой системы является атомарной, в противном случае она должна делать копию, которая не является атомарной (с последующим удалением исходного файла) и склонна к состоянию гонки, которое вы упомянули.

FWIW, это обычная семантика POSIX, ничего особенного для XFS.

person janneb    schedule 27.02.2012
comment
Мораль этой истории заключается в том, что вы можете убедиться, что вы в безопасности, просто убедившись, что первый скрипт помещает элементы в каталог из той же файловой системы; если это вызывает сомнения, вы можете переместить их в подкаталог целевого каталога first, а затем переместить их в целевой каталог, чтобы убедиться, что их прибытие является атомарным. - person zmccord; 27.02.2012

Состояние гонки не возникло бы в вашем случае в файловой системе XFS. Однако XFS позволяет нескольким процессам одновременно читать и записывать файл, используя гибкую схему блокировки, в отличие от однопоточной блокировки индексного дескриптора файловых систем Unix. XFS заботится о сериализации записей в одном и том же регионе несколькими процессами.

XFS использует прямой ввод-вывод для доступа к файлу. Прямой ввод-вывод позволяет приложению указать, что его данные не должны кэшироваться в буферном кеше.

При использовании обычного буферизованного ввода-вывода несколько читателей могут одновременно обращаться к файлу, но только одному писателю разрешен доступ к файлу одновременно. При использовании прямого ввода-вывода к файлу могут одновременно обращаться несколько программ чтения и записи.

person raj_gt1    schedule 27.02.2012