Управление состоянием буферизации

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

Существует несколько распространенных компонентов реализации когерентности кэша в типичном мини-редиректоре сети.

  • Изменения в процессах создания и открытия файлов.

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

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

    При обнаружении такого запроса необходимо активировать локальный механизм для координации состояний буферизации.

  • Механизм изменения состояния буферизации, реализуемого в рамках RDBSS. Любой запрос на буферизацию изменений должен определить структуру SRV_OPEN, к которой применяется запрос.

Объем вычислительных усилий, связанных с определением структуры SRV_OPEN, зависит от протокола и сведений о мини-перенаправлении сети. В протоколе SMB оппортунистические блокировки (oplocks) обеспечивают необходимую инфраструктуру для согласованности кэша. В реализации протокола SMB в Windows используются API-интерфейсы многомерных идентификаторов, предоставляемые RDBSS. Сервер выбирает идентификатор мультиплекса, используемый для идентификации файла, открытого на сервере. Идентификаторы мультиплекса связаны с NET_ROOT (общим ресурсом), на котором они открыты. Таким образом, каждый запрос состояния буферизации изменений определяется двумя ключами: NetRootKey и SrvOpenKey, которые необходимо преобразовать в соответствующую NET_ROOT и SRV_OPEN структуру соответственно. Чтобы обеспечить лучшую интеграцию с механизмом приобретения и выпуска ресурсов и избегать дублирования этих усилий в различных сетевых мини-перенаправлениях, RDBSS предоставляет эту службу.

Существует две подпрограммы, предоставляемые в RDBSSS для указания изменений состояния буферизации в SRV_OPEN структурах:

Обратите внимание, что ассоциации ключей необратимы и будут длиться весь срок существования связанной структуры SRV_OPEN.

Сетевые мини-перенаправления, требующие вспомогательного механизма для установления сопоставления мультиплексных идентификаторов со структурой SRV_OPEN, могут использовать RxIndicateChangeOfBufferingState, а сетевые мини-перенаправления, которые не требуют этой помощи, могут использовать RxIndicateChangeOfBufferingStateForSrvOpen.

Диспетчер буферизации в RDBSS обрабатывает эти запросы на разных этапах. Он поддерживает запросы, поступившие от различных мини-редиректоров сети, в одном из нескольких списков.

  • Список диспетчера содержит все запросы, для которых не было установлено соответствующее сопоставление со структурой SRV_OPEN.

  • Список обработчиков содержит все запросы, для которых было установлено соответствующее сопоставление, но еще не обработано.

  • LastChanceHandlerList содержит все запросы, для которых начальная обработка была неудачной. Обычно это происходит, когда ФКБ была получена в совместном режиме в момент, когда поступил запрос состояния буферизации изменений. В таких случаях запрос на разрыв блокировки может обрабатываться только отложенным потоком выполнения.

Обработка запросов состояния буферизации изменений в сетевом мини-редиректоре переплетается с протоколом получения и освобождения FCB. Это помогает обеспечить более короткое время поворота.

RDBSS предоставляет следующие подпрограммы для управления состоянием буферизации, которые могут использоваться драйверами мини-перенаправления сети:

Рутина Описание

RxChangeBufferingState

Эта подпрограмма вызывается для обработки запроса на изменение состояния буферизации.

RxIndicateChangeOfBufferingState

Эта подпрограмма вызывается для регистрации запроса на изменение состояния буферизации (например, указание на разрыв оплока) для последующей обработки.

RxIndicateChangeOfBufferingStateForSrvOpen

Эта подпрограмма вызывается для регистрации запроса на изменение состояния буферизации (например, указание на прерывание oplock) для последующей обработки.