предотвращение одновременной записи в общий текстовый файл NFS

Я пишу модуль на C++, который будет работать на кластере машин, каждая из которых имеет смонтированное файловое хранилище nfs.

У меня есть файл конфигурации, общий для всех машин через NFS; и все могут читать/писать этот файл. Как убедиться, что данные не повреждены из-за одновременного доступа?

Я знаю, что у NFS есть собственный протокол для блокировки, но я вижу его ненадежным - одновременный доступ к nfs . Я также вижу, что iNotify плохо работает на дисках, смонтированных через nfs — inotify пример. Я не уверен, что stat будет полезен для проверки доступа к файлу перед записью / чтение.

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


person sillysheep    schedule 06.07.2012    source источник
comment
... не пытаясь одновременно писать в один и тот же файл. Запишите в уникальную копию файла и поверните старый файл, используя переименование.   -  person Petesh    schedule 07.07.2012
comment
... другими словами, то же самое, что вы, вероятно, должны были бы делать в любом случае, если бы файл был локальным.   -  person Celada    schedule 07.07.2012
comment
это не вариант для меня, так как файл (с его fd) отслеживается IPC (сокетом домена unix) на предмет изменений. изменения передаются обратно в модуль для дальнейшей обработки.   -  person sillysheep    schedule 07.07.2012
comment
В этом случае лучшим вариантом, вероятно, будет прекращение использования NFS и получение файловой системы с поддержкой кластера, которая поддерживает блокировку файлов в масштабе кластера более надежным способом, чем блокировка NFS, не предназначенная для этого использования (которая, как уже отмечалось, может быть ненадежным вдобавок к тому, что он не предназначен для работы с такими вещами).   -  person twalberg    schedule 07.07.2012
comment
это снова не вариант для меня - я специально ищу предложения, которые помогли бы мне разработать механизм блокировки   -  person sillysheep    schedule 09.07.2012


Ответы (1)


Когда вы одновременно записываете содержимое A, B и C в файл, совместно используемый через NFS, окончательным содержимым будет либо ABC, либо любая возможная комбинация ABC, такая как BAC, CAB и т. д. Файл всегда будет согласованным, он будет никогда не пишите A частично, а затем B. Таким образом, запись происходит одна за другой. Обратите внимание, что это будет верно только в том случае, если размер содержимого находится в пределах размера блока NFS.

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

person djoker    schedule 09.07.2012
comment
Я неправильно сформулировал заголовок вопроса, мой плохой, я хотел бы избежать одновременного «доступа», а не только записи. Даже если одновременная запись не будет проблемой, одновременное чтение/запись будет. Механизм блокировки, чтобы избежать этого, - это то, что меня интересует. - person sillysheep; 10.07.2012