2017-01-10 14 views
-1

У меня есть базовый сценарий, который я хочу сделать следующее:NFS - команда mv от повреждения файлов с двумя клиентами?

  1. если новый/file.txt существует
  2. мв новый/file.txt ток/file.txt

Теперь - если 2 сервера должны были запускать этот же сценарий в одно и то же время (имея доступ к тому же файловому файлу NFS):

  • Сервер 1 - шаг 1. проверяет, существует ли файл. True
  • Сервер 2 - шаг 1. проверяет, существует ли файл. True
  • Сервер 1 - шаг 2. начинает выполнять команду «mv»
  • Сервер 2 - шаг 2. ????

Из того, что я могу найти в Интернете, это выглядит как ошибка просто вышвырнут на сервер 2 - но ни один файл с коррупцией или что-то не должно быть беспокойства: http://nfs.sourceforge.net/

Дескриптор файла ссылается на удаленный файл. После удаления файла на сервере клиенты не обнаруживают, пока не попытаются получить доступ к файлу с дескриптором файла, который они кэшировали из предыдущего LOOKUP. Использование rsync или mv для замены файла во время его использования на другом клиенте. - общий сценарий , который приводит к ошибке ESTALE.

Я пытался имитировать это подтвердить, но не были в состоянии сделать это успешно - так что я хотел проверить здесь до реализации этой стратегии:

Вопрос: ли мое понимание точным - или мне нужно использовать другую стратегию, чтобы файл.txt не повреждался?

Дополнительная информация: Amazon Linux OS. Привод установлен nsf4. Файл может быть не более 100 МБ.

+0

Если вы хотите проголосовать, можете ли вы указать причину, чтобы я мог соответствующим образом отрегулировать вопрос. – Phas1c

ответ

2

Ошибка-if-file-exists является типичной проблемой TOCTTOU.

Самым простым способом исправить это просто не чек, и попробовать к mv. Если файл не будет перемещен, то mv потерпит неудачу (и ничего не сделает).

+0

Хорошо, имеет смысл. Возможно ли, что сервер 1 начнет выполнять «mv», а сервер 2 пытается «mv» до завершения 1-го сервера (т. Е. Я предполагаю, что файл по-прежнему отображается в исходном каталоге)? Или это контролируется с помощью некоторых мьютексов/блокировок на уровне файловой системы? – Phas1c