Поделиться через


Управление блокировками файлов

Файлы Azure предоставляет доступ к облачным общим папкам по следующим протоколам:

  • Протокол SMB
  • Файловая система NFS
  • FileREST (HTTPS)

В этом разделе описывается управление взаимодействием блокировки файлов между SMB и FileREST. Общие папки NFS имеют другую семантику блокировки и поддерживают подмножество API FileREST. Этот раздел неприменим для общих папок NFS.

Блокировка SMB-файлов

Клиенты SMB, подключающие общие папки, могут использовать механизмы блокировки файловой системы для управления доступом к общим файлам. К ним относятся следующие объекты.

  • общий доступ для чтения, записи и удаления;
  • блокировка диапазона байтов для управления чтением и записью в областях в одном файле.

Когда клиент SMB открывает файл, он указывает как доступ к файлу, так и режим общего доступа. Клиенты SMB обычно используют следующие параметры доступа к файлам, хотя разрешены все сочетания:

  • Ни один: Открывает файл только для доступа к атрибуту запроса.
  • Прочитать: Открывает файл только для чтения.
  • Написать: Открывает файл только для записи.
  • Чтение и запись: Открывает файл с разрешениями на чтение и запись.
  • Удалить: Открывает файл только для доступа к удалению.

Клиенты SMB обычно используют следующие режимы общего доступа к файлам:

  • Ни один: Отклоняет общий доступ к текущему файлу. Любой запрос на открытие файла с доступом на чтение, запись или удаление завершится ошибкой, пока файл не будет закрыт.
  • Общий доступ для чтения: Разрешает последующее открытие файла для чтения. Если этот флаг не указан, любой запрос на открытие файла для чтения завершится ошибкой, пока файл не будет закрыт.
  • Общая запись: Разрешает последующее открытие файла для записи. Если этот флаг не указан, любой запрос на открытие файла для записи завершится ошибкой, пока файл не будет закрыт.
  • Общие операции чтения и записи: Разрешает последующее открытие файла для чтения или записи. Если этот флаг не указан, любой запрос на открытие файла для чтения или записи завершится ошибкой, пока файл не будет закрыт.
  • Удаление общего доступа. Разрешает последующее удаление файла. Если этот флаг не указан, любой запрос на удаление файла завершится ошибкой, пока файл не будет закрыт.

Примеры открытых файлов клиента SMB

Рассмотрим следующие примеры открытия файла:

  • Файл открывается без нарушения общего доступа

    • Клиент A открывает файл с FileAccess.Read помощью и FileShare.Write (запрещает последующие операции чтения и удаления при открытии).
    • Затем клиент B открывает файл с FileAccess.Write помощью fileShare.Read (запрещает последующие операции записи и удаления при открытии).
    • Результат: Это разрешено, так как нет конфликтов между режимами доступа к файлам и общей папки.
  • Нарушение общего доступа из-за доступа к файлам

    • Клиент A открывает файл с FileAccess.Write помощью и FileShare.Read (запрещает последующие операции записи и удаления при открытии).
    • Затем клиент B открывает файл с FileAccess.Write помощью fileShare.Write (запрещает последующие операции чтения и удаления при открытии).
    • Результат: Клиент B сталкивается с нарушением общего доступа. Клиент указал доступ к файлу, который запрещен режимом общего доступа, заданным ранее клиентом A.
  • Нарушение общего доступа из-за режима общего доступа

    • Клиент A открывает файл с FileAccess.Write помощью и FileShare.Write (запрещает последующие операции чтения и удаления при открытии).
    • Затем клиент B открывает файл с FileAccess.Write помощью fileShare.Read (запрещает последующие операции записи и удаления при открытии).
    • Результат: Клиент B сталкивается с нарушением общего доступа. Клиент указал режим общего доступа, который запрещает доступ на запись к файлу, который по-прежнему открыт для записи.

Доступ к файлам FileREST

При выполнении операции FileREST эта операция должна учитывать режим общего доступа, указанный для любого файла, открытого на клиенте SMB. Используйте следующий режим доступа к файлам, чтобы определить, можно ли завершить операцию:

Операция FileREST Эквивалент доступа к файлам
Список каталогов и файлов Недоступно
Создание файла Запись, удаление.
Получение данных из файла доступ для чтения;
Задание свойств файла Запись.
Получение свойств файла Недоступно
Установка метаданных файла Запись.
Получение метаданных файла Недоступно
Удаление файла Удаление.
Диапазон Put Запись.
Диапазоны списка доступ для чтения;
Файл аренды Запись, удаление и совместное чтение на период аренды.

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

Ниже приведены примеры запросов FileREST, взаимодействующих с режимами общего доступа SMB.

  • Нарушение общего доступа к файлам в FileREST

    • Клиент SMB открывает файл с FileAccess.Read помощью и FileShare.Write (запрещает последующие операции чтения и удаления при открытии).
    • Затем клиент REST выполняет операцию получения файла с файлом (таким образом, используя FileAccess.Read , как указано в предыдущей таблице).
    • Результат: Запрос клиента REST завершается сбоем с кодом состояния 409 (конфликт) и кодом SharingViolationошибки . Клиент SMB по-прежнему открывает файл и запрещает доступ на чтение и удаление.
  • Нарушение общего доступа к диапазону FileREST

    • Клиент SMB открывает файл с FileAccess.Write помощью и FileShare.Read (запрещает последующие операции записи и удаления при открытии).
    • Затем клиент REST выполняет операцию Put Range с файлом (таким образом используется FileAccess.Write , как указано в предыдущей таблице).
    • Результат: Запрос клиента REST завершается сбоем с кодом состояния 409 (конфликт) и кодом SharingViolationошибки . Клиент SMB по-прежнему открывает файл и запрещает доступ на запись и удаление.

Следующий раздел содержит полную таблицу сценариев нарушения общего доступа к API FileREST.

Влияние режима общего доступа клиента SMB на FileREST

В зависимости от режима общего доступа, указанного при открытии файла клиентом SMB, fileREST может возвращать код состояния 409 (конфликт) с кодом SharingViolationошибки . В следующей таблице представлено несколько сценариев.

Режим общего доступа к файлам клиента SMB Сбой операций FileREST с нарушением общего доступа
None

(Deny Read, Write, Delete)
Следующие операции чтения, записи, аренды и удаления для файла завершатся ошибкой:

  • Создание файла
  • Получение данных из файла
  • Установка свойств файла
  • Установка метаданных файла
  • Удаление файла
  • Диапазон Put
  • Перечисление диапазонов
  • Файл аренды
Shared Read

Deny Write, Delete)
Следующие операции записи, аренды и удаления файла завершатся сбоем:

  • Создание файла
  • Установка свойств файла
  • Установка метаданных файла
  • Удаление файла
  • Диапазон Put
  • Файл аренды
Shared Write

(Deny Read, Delete)
Следующие операции чтения, аренды и удаления файла завершатся ошибкой:

  • Создание файла
  • Получение данных из файла
  • Удаление файла
  • Перечисление диапазонов
  • Файл аренды
Shared Delete

(Deny Read, Write)
Следующие операции чтения, записи и аренды для файла завершатся сбоем:

  • Создание файла
  • Получение данных из файла
  • Установка свойств файла
  • Установка метаданных файла
  • Диапазон Put
  • Перечисление диапазонов
  • Удаление файла
  • Файл аренды
Shared Read/Write

(Deny Delete)
Следующие операции аренды и удаления для файла завершатся сбоем:

  • Создание файла
  • Удаление файла
  • Файл аренды
Shared Read/Delete

(Deny Write)
Следующие операции записи, аренды и удаления файла завершатся сбоем:

  • Создание файла
  • Установка свойств файла
  • Установка метаданных файла
  • Диапазон Put
  • Удаление файла
  • Файл аренды
Shared Write/Delete

(Deny Read)
Следующие операции чтения и аренды для файла завершатся сбоем:

  • Получение данных из файла
  • Перечисление диапазонов
  • Удаление файла
  • Файл аренды
Shared Read/Write/Delete

(Deny Nothing)
Удаление файла

Файлы Azure возвращает нарушения общего доступа только в том случае, если файлы открыты на клиентах SMB. Для успешной операции удаления файла FileREST не может быть клиентов SMB с открытыми дескрипторами для этого файла. Дополнительные сведения см. в разделах Операция удаления файла и Взаимодействие между блокировками FileREST и SMB.

Влияние блокировки файлов SMB на API аренды FileREST

В зависимости от параметров доступа к файлу, указанных при открытии файла клиентом SMB, API аренды FileREST может возвращать код состояния 409 (конфликт) с кодом SharingViolationошибки . В следующей таблице приведены дополнительные сведения.

Параметр доступа клиента SMB к файлам Получение аренды для файла без активной аренды с помощью API файла аренды
Нет Выполняется
Read Выполняется
Write Сбой из-за SharingViolation
Удалить Сбой из-за SharingViolation
Чтение|Написать Сбой из-за SharingViolation
Чтение|Удалить Сбой из-за SharingViolation
Запись|Удалить Сбой из-за SharingViolation
Чтение|Запись|Удалить Сбой из-за SharingViolation

Файлы Azure возвращает нарушения общего доступа только в том случае, если файлы открыты на клиентах SMB. Обратите внимание, что для успешной операции FileREST Lease File не может быть клиентов SMB с открытыми дескрипторами записи или удаления для этого файла. Дополнительные сведения см. в разделах Операция с файлом аренды и Взаимодействие между блокировками FileREST и SMB.

Влияние файла аренды FileREST на блокировку файлов SMB

Аренда файла обеспечивает монопольный доступ на запись и удаление файла. Когда клиент SMB открывает файл, он должен соблюдать блокировку для любого файла, арендованного операцией FileREST Lease File. Вы можете использовать следующую таблицу, чтобы определить, можно ли завершить операцию открытия файла SMB:

Состояние аренды файла FileREST Сбой операций SMB с нарушением общего доступа
Арендовано Клиенты SMB, открывая файл со следующим доступом, завершатся ошибкой:

  • FileAccess.Write
  • FileAccess.Delete
  • FileAccess.Read|FileAccess.Write
  • FileAccess.Write|FileAccess.Delete
  • FileAccess.Read|FileAccess.Write|FileAccess.Delete
Доступно Нет
Неисправно Нет

Последствия удаления SMB для FileREST

Когда клиент SMB открывает файл для удаления, он помечает файл как ожидающий удаления, пока все остальные открытые дескриптора SMB для этого файла не будут закрыты. Хотя файл помечен как ожидающий удаления, любая операция FileREST с этим файлом возвращает код состояния 409 (конфликт) с кодом SMBDeletePendingошибки . Код состояния 404 (Не найдено) не возвращается, так как клиент SMB может удалить флаг ожидающего удаления перед закрытием файла. Иными словами, получение кода состояния 404 (не найден) возможно только после удаления файла.

Пока файл находится в состоянии ожидания удаления SMB, он не будет включен в List Files результаты.

Кроме того, обратите внимание, что операции FileREST Delete File и Delete Directory фиксируются атомарно и не приводят к состоянию ожидания удаления.

Влияние атрибутов файла на FileREST

Клиенты SMB могут читать и задавать атрибуты файлов, в том числе:

  • Архив
  • Только для чтения
  • Скрытый
  • Система

Если файл или каталог помечены как доступные только для чтения, любая операция FileREST, которая пытается записать в файл, завершится ошибкой с кодом состояния 412 (сбой предусловия) и кодом ReadOnlyAttributeошибки . например:

  • Create File
  • Set File Properties
  • Set File Metadata
  • Put Range

Эти атрибуты файла нельзя задать или считывать из клиентов REST. После того как файл будет доступен только для чтения, клиенты REST не смогут выполнять запись в файл до тех пор, пока клиент SMB не удалит атрибут только для чтения.

Взаимодействие между оппортунистическими блокировками FileREST и SMB

Нежесткие блокировки SMB (oplock) — это механизм кэширования, запрашиваемый клиентами SMB для повышения производительности и снижения объема сетевого трафика. Клиент SMB может кэшировать последнее состояние определенного файла или каталога. Существует несколько типов нежестких блокировок, которые называют типами аренды SMB:

  • Чтение (R): клиент SMB может считывать данные из локального кэша.
  • Write (W): клиент SMB может записывать данные локально без необходимости сбрасывать данные обратно в общую папку Azure.
  • Дескриптор (H): клиенту SMB не требуется немедленно уведомлять общую папку Azure при закрытии дескриптора. Этот тип блокировки полезен, когда приложение продолжает открывать и закрывать файлы с одинаковым режимом доступа и общего доступа.

Эти типы аренды не зависят от указанного режима доступа и совместного использования. Как правило, клиент SMB пытается получить все типы аренды всякий раз, когда открывает новый дескриптор для файла, независимо от режима доступа и общего доступа.

В зависимости от вызванной операции FileREST может потребоваться запросить прерывание существующей оппортунистической блокировки. В случае блокировки операций записи клиент SMB должен очистить кэшированные изменения в общей папке Azure. Ниже приведены ситуации, для которых необходимо отменить каждый тип блокировки.

  • Блокировка операций чтения (R) должна быть нарушена при выполнении операции записи, например Put Range.

  • При выполнении операции чтения операции записи (W) необходимо прерывать каждый раз, когда выполняется операция чтения, например Get File.

  • Блокировка дескриптора (H) должна быть нарушена всякий раз, когда клиент выполняет операцию удаления. Файлы Azure требует, чтобы дескриптор не был открыт, если операция удаления должна завершиться успешно.

    Блокировки обработки также нарушаются, когда операция FileREST сталкивается с нарушением общего доступа с существующим дескриптором SMB. Это происходит, чтобы убедиться, что дескрипторы по-прежнему открыты приложением, работающим на клиентах.

Для прерывания блокировки операции может потребоваться очистка кэшированных изменений клиента SMB, что может привести к задержкам в времени отклика операции. Очистка также может привести к сбою операции с кодом состояния 408 (время ожидания запроса) и кодом ClientCacheFlushDelayошибки .

В следующих разделах рассматриваются сценарии, в которых блокировки не работают.

Требуется прерывание блокировки и очистка клиента SMB, а клиент REST испытывает задержку.

Рассмотрим следующий пример.

  1. Клиент SMB открывает файл, получает блокировку RWH и записывает данные локально.

  2. Клиент REST отправляет Get File запрос.

    • Общая папка Azure прерывает блокировку записи (W), оставляя клиент с RH-блокировкой.
    • Клиент SMB сбрасывает кэшированные данные в общую папку Azure и подтверждает прерывание операции.
    • Общая папка Azure обрабатывает Get File запрос и отвечает запрошенными данными.

В этом примере клиент REST испытывает задержки. Эта ситуация вызвана прерыванием блокировки и временем, затраченным клиентом SMB на очистку данных в файловом ресурсе Azure.

Последующие вызовы для Get File не испытывают дополнительных задержек, так как операция записи (W) уже была нарушена.

Требуется отмена блокировки, но в клиенте REST не возникает задержка

Рассмотрим следующий пример.

  1. SMB-клиент получил блокировку RH.

  2. Клиент REST отправляет Put Range запрос.

    • Общая папка Azure отправляет запрос на прерывание блокировки клиенту SMB и не ожидает ответа.
    • Файловый ресурс Azure обрабатывает Put Range запрос.

В этом примере требуется прерывание блокировки, но Put Range запрос не испытывает дополнительных задержек. При прерывании операции чтения ответ не требуется.

поведение Файлы Azure

В следующей таблице представлено поведение Файлы Azure для каждой операции FileREST. Это поведение основано на состоянии oplock клиента SMB, который уже получил дескриптор в том же файле. Кроме того, в поведении предполагается, что доступ и общий доступ к обработке SMB не конфликтуют с операцией FileREST.

Если возникает конфликт, блокировка дескриптора также прерывается, чтобы убедиться, что дескриптор все еще открыт на клиенте. В случае блокировки блокировки Файлы Azure должны дождаться подтверждения того, что перерыв был успешным. В случае неблокирующего разрыва блокировки Файлы Azure не нужно ждать.

Операция FileREST Текущие типы oplock Выполнена приостановка работы oplock Результирующая блокировка
Получение данных из файла RWH Да (блокировка) RH
Получение данных из файла RH Нет RH
Получение данных из файла RW Да (блокировка) R
Получение свойств файла RWH Да (блокировка) RH
Получение свойств файла RH Нет RH
Получение свойств файла RW Да (блокировка) R
Перечисление диапазонов RWH Да (блокировка) RH
Перечисление диапазонов RH Нет RH
Перечисление диапазонов RW Да (блокировка) R
Получение метаданных файла RWH Да (блокировка) RH
Получение метаданных файла RH Нет RH
Получение метаданных файла RW Да (блокировка) R
Список файлов RWH Нет RWH
Список файлов RH Нет RH
Список файлов RW Нет RW
Диапазон Put RWH Да (блокировка) Нет
Диапазон Put RH Да (без блокировки) Нет
Диапазон Put RW Да (блокировка) Нет
Установка свойств файла RWH Да (блокировка) Нет
Установка свойств файла RH Да (без блокировки) Нет
Установка свойств файла RW Да (блокировка) Нет
Установка метаданных файла RWH Да (блокировка) Нет
Установка метаданных файла RH Да (без блокировки) Нет
Установка метаданных файла RW Да (блокировка) Нет
Удаление файла RWH Да (блокировка) RW
Удаление файла RH Да (блокировка) R
Удаление файла RW Нет RW

В случае, когда требуется блокировка блокировки, при определенных условиях операция FileREST завершается сбоем. Если прерывание не завершается в течение указанного времени ожидания запроса или в течение 30 секунд( в зависимости от того, что завершается первым), служба возвращает код состояния 408 (время ожидания запроса) и код ClientCacheFlushDelayошибки .

Запрос Delete File также требует нарушения аренды дескриптора блокировки (H). Нарушение дескриптора гарантирует отсутствие дескрипторов файлов, открытых клиентским приложением SMB, когда клиент REST вызывает Delete File. При нарушении общего доступа запрос завершается ошибкой с кодом состояния 409 (конфликт) и кодом SharingViolationошибки .

См. также раздел

основные понятия Файлы Azure