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


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

Структура 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. Для этого кэша имен поддерживается двухсекундное окно, которое становится недействительным при отправке какой-либо операции на сервер. Это может произойти, когда в клиентском приложении открыт файл (sample1), который приложение на сервере может использовать для создания другого файла (sample2) на сервере. Когда клиент считывает первый файл (sample1) и узнает, что второй файл (sample2) создан на сервере, попадание в кэш имен, соответствующее второму файлу (sample2), не может вернуть ошибку. Эта оптимизация обрабатывает только случай последовательных операций открытия файлов с тем же файлом, который еще не существует. Этот сценарий происходит с использованием 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).