rename () на атомарности NFS

У меня есть процесс, который:

  • записывает новый файл '.tmp'.
  • использует системный вызов rename () для замены существующего файла.
  • Доступ к этому файлу осуществляется с удаленного клиента NFS.

Мы делаем это, потому что нам нужны атомарные обновления файлов, а спецификация 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.

4
задан 30 November 2016 в 14:37
1 ответ

Предотвращение состояний гонки в NFS

Это всегда увлекательная задача, и единственный известный мне способ обхода без перезаписи приложений - это смонтировать общий ресурс с параметрами sync и изменить используемый сервер NFS no_wdelay . Я не помню, как установить no_wdelay в NetApp.

Обратной стороной этого метода является то, что если у вас есть много одновременных операций записи в этот общий ресурс, они станут экспоненциально медленнее. Вы можете спросить NetApp, как установить no_wdelay на этом ресурсе, или просто опишите им проблему. У них могут быть идеи получше. Я не прикасался к NetApp как минимум 8 лет.

2
ответ дан 3 December 2019 в 03:54

Теги

Похожие вопросы