Управление блокировками файлов
Файлы 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 открывает файл с
Нарушение общего доступа из-за доступа к файлам
- Клиент A открывает файл с
FileAccess.Write
помощью и FileShare.Read (запрещает последующие операции записи и удаления при открытии). - Затем клиент B открывает файл с
FileAccess.Write
помощью fileShare.Write (запрещает последующие операции чтения и удаления при открытии). - Результат: Клиент B сталкивается с нарушением общего доступа. Клиент указал доступ к файлу, который запрещен режимом общего доступа, заданным ранее клиентом A.
- Клиент A открывает файл с
Нарушение общего доступа из-за режима общего доступа
- Клиент A открывает файл с
FileAccess.Write
помощью и FileShare.Write (запрещает последующие операции чтения и удаления при открытии). - Затем клиент B открывает файл с
FileAccess.Write
помощью fileShare.Read (запрещает последующие операции записи и удаления при открытии). - Результат: Клиент B сталкивается с нарушением общего доступа. Клиент указал режим общего доступа, который запрещает доступ на запись к файлу, который по-прежнему открыт для записи.
- Клиент A открывает файл с
Доступ к файлам FileREST
При выполнении операции FileREST эта операция должна учитывать режим общего доступа, указанный для любого файла, открытого на клиенте SMB. Используйте следующий режим доступа к файлам, чтобы определить, можно ли завершить операцию:
Операция FileREST | Эквивалент доступа к файлам |
---|---|
Список каталогов и файлов | Недоступно |
Создание файла | Запись, удаление. |
Получение данных из файла | доступ для чтения; |
Задание свойств файла | Запись. |
Получение свойств файла | Недоступно |
Установка метаданных файла | Запись. |
Получение метаданных файла | Недоступно |
Удаление файла | Удаление. |
Диапазон Put | Запись. |
Диапазоны списка | доступ для чтения; |
Файл аренды | Запись, удаление и совместное чтение на период аренды. |
Список каталогов и файлов, получение свойств файла и получение метаданных файла не работают с содержимым файла. Для этих операций не требуется доступ на чтение к файлу (т. е. эти операции выполняются успешно, даже если клиент SMB открыт для монопольного доступа на чтение).
Ниже приведены примеры запросов FileREST, взаимодействующих с режимами общего доступа SMB.
Нарушение общего доступа к файлам в FileREST
- Клиент SMB открывает файл с
FileAccess.Read
помощью и FileShare.Write (запрещает последующие операции чтения и удаления при открытии). - Затем клиент REST выполняет операцию получения файла с файлом (таким образом, используя
FileAccess.Read
, как указано в предыдущей таблице). -
Результат: Запрос клиента REST завершается сбоем с кодом состояния 409 (конфликт) и кодом
SharingViolation
ошибки . Клиент SMB по-прежнему открывает файл и запрещает доступ на чтение и удаление.
- Клиент SMB открывает файл с
Нарушение общего доступа к диапазону FileREST
- Клиент SMB открывает файл с
FileAccess.Write
помощью и FileShare.Read (запрещает последующие операции записи и удаления при открытии). - Затем клиент REST выполняет операцию Put Range с файлом (таким образом используется
FileAccess.Write
, как указано в предыдущей таблице). -
Результат: Запрос клиента REST завершается сбоем с кодом состояния 409 (конфликт) и кодом
SharingViolation
ошибки . Клиент SMB по-прежнему открывает файл и запрещает доступ на запись и удаление.
- Клиент SMB открывает файл с
Следующий раздел содержит полную таблицу сценариев нарушения общего доступа к API FileREST.
Влияние режима общего доступа клиента SMB на FileREST
В зависимости от режима общего доступа, указанного при открытии файла клиентом SMB, fileREST может возвращать код состояния 409 (конфликт) с кодом SharingViolation
ошибки . В следующей таблице представлено несколько сценариев.
Режим общего доступа к файлам клиента SMB | Сбой операций FileREST с нарушением общего доступа |
---|---|
None (Deny Read, Write, Delete) |
Следующие операции чтения, записи, аренды и удаления для файла завершатся ошибкой:
|
Shared Read Deny Write, Delete) |
Следующие операции записи, аренды и удаления файла завершатся сбоем:
|
Shared Write (Deny Read, Delete) |
Следующие операции чтения, аренды и удаления файла завершатся ошибкой:
|
Shared Delete (Deny Read, Write) |
Следующие операции чтения, записи и аренды для файла завершатся сбоем:
|
Shared Read/Write (Deny Delete) |
Следующие операции аренды и удаления для файла завершатся сбоем:
|
Shared Read/Delete (Deny Write) |
Следующие операции записи, аренды и удаления файла завершатся сбоем:
|
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, открывая файл со следующим доступом, завершатся ошибкой:
|
Доступно | Нет |
Неисправно | Нет |
Последствия удаления 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 испытывает задержку.
Рассмотрим следующий пример.
Клиент SMB открывает файл, получает блокировку RWH и записывает данные локально.
Клиент REST отправляет
Get File
запрос.- Общая папка Azure прерывает блокировку записи (W), оставляя клиент с RH-блокировкой.
- Клиент SMB сбрасывает кэшированные данные в общую папку Azure и подтверждает прерывание операции.
- Общая папка Azure обрабатывает
Get File
запрос и отвечает запрошенными данными.
В этом примере клиент REST испытывает задержки. Эта ситуация вызвана прерыванием блокировки и временем, затраченным клиентом SMB на очистку данных в файловом ресурсе Azure.
Последующие вызовы для Get File
не испытывают дополнительных задержек, так как операция записи (W) уже была нарушена.
Требуется отмена блокировки, но в клиенте REST не возникает задержка
Рассмотрим следующий пример.
SMB-клиент получил блокировку RH.
Клиент 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
ошибки .