Опасно ли, чтобы несколько параллельных заданий одновременно создавали один и тот же каталог?

Опасно ли, чтобы несколько параллельных заданий создавали один и тот же каталог, используя mkdir -p? (Это под Linux.)

В моем случае я отправляю много заданий в сетку SUN для их параллельной обработки, и некоторые из этих заданий начинаются с создания определенного каталога foo, Итак, исполнение разных mkdir команды могут происходить в одно и то же время...

4 ответа

Решение

Простой mkdir является атомарным (если вы используете NTFS, есть вероятность, что он не атомарный, нужна некоторая проверка).

По дедукции mkdir -p folder1/folder2/ начинается с создания folder1, которое является атомарным. В то же время, другой процесс пытается также создать папку 1, он увидит, что папка 1 создана, поэтому он попытается создать папку 2, которая либо потерпит неудачу (если первый процесс уже создал папку 2), либо завершится успешно, а первый процесс потерпит неудачу.

Это не должно быть проблемой, если это правильно обработано (т.е. хорошая обработка ошибок).

Не должно быть никакой опасности для любой POSIX-совместимой файловой системы из нескольких одновременных (гоночных) mkdir -p команды. На самом деле, я проверил свою собственную функцию блокировки сценария оболочки (обернутый вокруг mkdir ... || ... (но НЕ с -p) используя сотни гоночных процессов в моих усилиях по обнаружению любых сбоев в гонках на Linux и Solaris с несколькими различными локальными операционными системами. Я никогда не видел никаких сбоев, и мой поиск и чтение подсказали, что это должно быть безопасно.

(Nitpick: в вашем случае это звучит так, как будто атомарность не требуется. Атомность критична для мьютекса / блокировки, но не обязательна для простой безопасности --- mkdir() может безопасно потерпеть неудачу, когда каталог уже существует. Несколько гонок mkdir У каждой команды оболочки должны быть свои вызовы безвредными, поскольку они пересекают компоненты целевого пути, пытаясь создать каждую из них. Атомность не имеет к этому отношения).

Локальный fs должен быть posix, а все операции (включая создание каталогов) должны быть атомарными.

Я предполагаю, что все сводится к тому, что делает mkdir -p, когда начинает создавать путь, а затем внезапно встречает (еще) элемент этого пути, который уже создан. Если он нормальный, он останется независимым от того, что делал раньше, и ваши операции должны быть безопасными. Для получения подробной информации о вашем конкретном инструменте mkdir вы должны увидеть исходный код.

В сетевых / кластерных файловых системах это может очень зависеть от задержки в сети, загрузки сервера или параметров монтирования.

Кроме того, было бы нетрудно написать скрипт, который много раз пробует его с высокой степенью параллелизма, ошибки должны быть легко обнаруживаемыми.

Нет, это не опасно.

Одной работе удастся создать каталог, а другой не удастся.

Другие вопросы по тегам