Типы оппортунистических блокировок

Операции оппортунистических блокировок работают с четырьмя типами оппортунистических блокировок: уровень 1, уровень 2, пакетная блокировка и фильтрация. Монопольные оппортунистические блокировки — это блокировки уровня 1, пакетные блокировки и блокировки фильтров. Если поток имеет какой-либо тип монопольной блокировки для файла, он не может также иметь блокировку уровня 2 для того же файла.

Оппортунистические блокировки уровня 1

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

Клиент может запросить оппортунистическую блокировку уровня 1 после открытия файла. Если ни один другой клиент (или ни один другой поток на том же клиенте) не открыт, сервер может предоставить оппортунистическую блокировку. Затем клиент может кэшировать данные для чтения и записи из файла локально. Если файл открыт другим клиентом, сервер отклоняет оппортунистическую блокировку, а клиент не выполняет локальное кэширование. (Сервер может отказаться от оппортунистической блокировки и по другим причинам, например не поддерживает оппортунистические блокировки.)

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

Тем не менее, так как сервер проверяет состояние общего доступа перед прерыванием блокировки, в случае, когда сервер отклонит открытый запрос из-за конфликта общего доступа, сервер не сломает блокировку. Например, если вы открыли файл, отказали в предоставлении общего доступа для операций записи и получили блокировку уровня 1, сервер отклоняет запрос другого клиента на открытие файла для записи, прежде чем он даже проверит блокировку файла. В этом случае оппортунистическая блокировка не нарушена.

Пример работы оппортунистической блокировки уровня 1 см. в разделе Пример оппортунистической блокировки уровня 1. Дополнительные сведения о нарушении оппортунистических блокировок см. в разделе Нарушение оппортунистических блокировок.

Оппортунистические блокировки уровня 2

Оппортунистическая блокировка уровня 2 сообщает клиенту о наличии нескольких одновременных клиентов файла и о том, что ни один из них еще не изменил его. Эта блокировка позволяет клиенту выполнять операции чтения и получать атрибуты файлов с помощью кэшированных или упреждаемых локальных сведений, но клиент должен отправлять все остальные запросы (например, для операций записи) на сервер. Приложение должно использовать оппортунистическую блокировку уровня 2, если ожидается, что другие приложения будут выполнять запись в файл случайным образом или считывать файл случайным образом или последовательно.

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

Дополнительные сведения о нарушении оппортунистических блокировок см. в разделе Нарушение оппортунистических блокировок.

Оппортунистические блокировки пакетной службы

Пакетная оппортунистическая блокировка управляет открытием и закрытием файлов. Например, при выполнении пакетного файла пакетный файл может быть открыт и закрыт один раз для каждой строки файла. Пакетная оппортунистическая блокировка открывает пакетный файл на сервере и сохраняет его открытым. Когда обработчик команд "открывает" и "закрывает" пакетный файл, перенаправитель сети перехватывает команды открытия и закрытия. Все, что получает сервер, — это команды поиска и чтения. Если клиент также выполняет чтение заранее, сервер получает определенный запрос на чтение не более одного раза.

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

Пример работы пакетной оппортунистической блокировки см. в разделе Batch Opportunistic Lock Example. Дополнительные сведения о нарушении оппортунистических блокировок см. в разделе Нарушение оппортунистических блокировок.

Фильтрация оппортунистических блокировок

Фильтр оппортунистической блокировки блокирует файл, чтобы его нельзя было открыть для записи или удаления доступа. Все клиенты должны иметь возможность предоставить общий доступ к файлу. Блокировки фильтров позволяют приложениям выполнять неинтрусивные операции фильтрации файловых данных (например, компилятор, открывающий исходный код или программу каталогизации).

Оппортунистическая блокировка фильтра отличается от оппортунистической блокировки уровня 2 тем, что позволяет выполнять открытые операции чтения без нарушений режима совместного использования в интервале времени между открытием файла и получением блокировки приложением. Оппортунистическая блокировка фильтра — это лучшая блокировка для использования, когда важно разрешить другим клиентам доступ к чтению. В других случаях приложение должно использовать оппортунистическую блокировку уровня 2. Оппортунистическая блокировка фильтра отличается от пакетной оппортунистической блокировки тем, что она не позволяет обрабатывать несколько открытий и закрытий перенаправлением сети так, как это делает пакетная оппортунистическая блокировка.

Приложение должно запросить фильтрацию оппортунистической блокировки для файла в три шага:

  1. Используйте функцию CreateFile , чтобы открыть дескриптор файла с параметром DesiredAccess , равным нулю, указывая на отсутствие доступа, и параметру dwShareMode присвоен флаг FILE_SHARE_READ , чтобы разрешить общий доступ для чтения. Дескриптор, полученный на этом этапе, называется дескриптором блокировки.
  2. Запросите блокировку этого дескриптора с помощью кода элемента управления FSCTL_REQUEST_FILTER_OPLOCK .
  3. Когда блокировка будет предоставлена, используйте createFile , чтобы снова открыть файл с параметром DesiredAccess , установленным для флага GENERIC_READ . Присвойте dwShareMode флаг FILE_SHARE_READ , чтобы разрешить другим пользователям читать файл, пока он открыт, флаг FILE_SHARE_DELETE, чтобы другие пользователи могли пометить файл для удаления при его открытии, или и то, и другое. Дескриптор, полученный на этом этапе, называется дескриптором чтения.

Используйте дескриптор чтения для чтения содержимого файла или записи в него.

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

Дополнительные сведения о нарушении оппортунистических блокировок см. в разделе Нарушение оппортунистических блокировок.