Назад | Перейти на главную страницу

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

Опасно ли, если несколько параллельных заданий создают один и тот же каталог с помощью mkdir -p? (Это под Linux.)

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

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

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

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

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

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

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

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

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

Одно задание успешно создаст каталог, а другое не удастся.

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

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