Управление кэшем имен

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

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

Структура NAME_CACHE имеет общедоступную часть, которая доступна сетевому мини-редиректору, MRX_NAME_CACHE, и частный раздел для использования исключительно RDBSS. Часть мини-перенаправителя имеет поле NTSTATUS контекста, представляющее результат предыдущей операции сервера с этой записью имени, и указатель расширения контекста для некоторого дополнительного хранилища, специфичного для мини-перенаправителя, которое можно совместно выделить со структурой NAME_CACHE. Дополнительные сведения см. в статье RxNameCacheInitialize.

Для сети Windows число операций SMB является примером состояния мини-перенаправителя, которое можно сохранить в поле контекста MRX_NAME_CACHE. При вызове RxNameCacheCheckEntry выполняется проверка равенства между полем контекста и предоставленным параметром в рамках поиска совпадения в кэше имен. Когда создается или обновляется запись NAME_CACHE, ставится задача сетевого мини-перенаправителя предоставить соответствующее значение для этого поля и времени жизни в секундах для записи NAME_CACHE.

Частная часть RDBSS структуры NAME_CACHE содержит имя в виде строки Юникода, хэш-значение имени для ускорения поиска, истечения срока действия записи и флаг, указывающий, поддерживает ли сервер имена с учетом регистра.

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

В настоящее время существуют кэши имен, поддерживаемые RDBSS для OBJECT_NAME_NOT_FOUND. Для этого кэша имен сохраняется двухсекундное окно, которое является недействительным, если любая операция отправляется на сервер. Это может произойти, когда клиентское приложение открывает файл (пример1), что приложение на сервере может использовать для сигнала о создании другого файла (пример2) на сервере. Когда клиент считывает первый файл (sample1) и узнает, что второй файл (sample2) был создан на сервере, то попадание в кэш имен, соответствующий второму файлу (пример2), не может вернуть ошибку. Эта оптимизация обрабатывает только случай последовательных операций открытия файлов в том же файле, который еще не существует. Этот сценарий происходит с помощью Microsoft Word.

Ниже перечислены подпрограммы управления кэшем имен RDBSS.

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

RxNameCacheActivateEntry

Эта подпрограмма принимает запись кэша имен и обновляет время окончания срока действия и контекст мини-перенаправления сети. Затем он помещает запись в активный список.

RxNameCacheCheckEntry

Эта подпрограмма проверяет NAME_CACHE запись для допустимости.

RxNameCacheCreateEntry

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

RxNameCacheExpireEntry

Эта подпрограмма помещает запись NAME_CACHE в бесплатный список.

RxNameCacheExpireEntryWithShortName

Эта подпрограмма истекает все записи NAME_CACHE, префикс имени которых соответствует заданному короткому имени файла.

RxNameCacheFetchEntry

Эта подпрограмма ищет совпадение с указанной строкой имени для записи NAME_CACHE.

RxNameCacheFinalize

Эта подпрограмма освобождает хранилище для всех записей NAME_CACHE, связанных со структурой NAME_CACHE_CONTROL.

RxNameCacheFreeEntry

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

RxNameCacheInitialize

Эта подпрограмма инициализирует кэш имен (структура NAME_CACHE_CONTROL).