У меня есть процесс, который:
rename ()
для замены существующего файла. Мы делаем это, потому что нам нужны атомарные обновления файлов, а спецификация rename ()
говорит:
Если новый путь уже существует, он будет заменен атомарно, так что нет точки, в которой другой процесс пытается получить доступ newpath обнаружит, что он отсутствует. Однако, вероятно, будет окно, в котором и oldpath, и newpath ссылаются на файл, переименовано.
Мы полагаемся на это поведение.
Но вот загвоздка - совсем недавно, после перехода на новый NetApp (режим кластера, из режима 7) - у нас был процесс, который очень иногда падает с ENOENT
- такого файла нет или каталог.
Под «очень иногда» я имею в виду - 4 или 5 раз за последние несколько недель, процесс, который происходит каждые 5 минут или около того.
Я выясняю у поставщика, может ли это быть ошибкой на их сервере NFS.
Но на самом деле я пытаюсь выяснить, применима ли эта гарантия атомарности к NFS. Может ли кто-нибудь прояснить мне, применяется ли гарантия атомарности rename ()
к мультиклиентским сценариям NFS? Я не совсем уверен, что эта функция работает, но никогда не было гарантировано во-первых.
From: RFC1813
Процедура RENAME переименовывает файл, идентифицированный from.name в каталоге, from.dir, to.name в каталоге, to.dir. Операция должна быть атомарной по отношению к клиент.
Если это актуально, у нас есть клиенты SL 6.5, которые обращаются к хранилищам данных NFS на ONTAP-CDOT 8.3.
Предотвращение состояний гонки в NFS
Это всегда увлекательная задача, и единственный известный мне способ обхода без перезаписи приложений - это смонтировать общий ресурс с параметрами sync
и изменить используемый сервер NFS no_wdelay
. Я не помню, как установить no_wdelay в NetApp.
Обратной стороной этого метода является то, что если у вас есть много одновременных операций записи в этот общий ресурс, они станут экспоненциально медленнее. Вы можете спросить NetApp, как установить no_wdelay на этом ресурсе, или просто опишите им проблему. У них могут быть идеи получше. Я не прикасался к NetApp как минимум 8 лет.