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


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

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

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

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

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

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

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

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

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

В RDBSS предусмотрены две процедуры для указания изменений состояния буферизации в SRV_OPEN структурах:

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

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

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

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

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

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

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

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

Подпрограмма Описание

RxChangeBufferingState

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

RxIndicateChangeOfBufferingState

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

RxIndicateChangeOfBufferingStateForSrvOpen

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