Опасно ли, чтобы несколько параллельных заданий одновременно создавали один и тот же каталог?
Опасно ли, чтобы несколько параллельных заданий создавали один и тот же каталог, используя 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 вы должны увидеть исходный код.
В сетевых / кластерных файловых системах это может очень зависеть от задержки в сети, загрузки сервера или параметров монтирования.
Кроме того, было бы нетрудно написать скрипт, который много раз пробует его с высокой степенью параллелизма, ошибки должны быть легко обнаруживаемыми.
Нет, это не опасно.
Одной работе удастся создать каталог, а другой не удастся.