名称缓存管理

NAME_CACHE结构缓存在服务器上执行的最新操作的名称字符串,以便客户端可以禁止冗余请求。 例如,如果打开的请求最近失败并显示“找不到文件”消息,并且客户端应用程序使用大写字符串再次尝试打开请求,并且网络微型重定向程序不支持区分大小写的名称,则 RDBSS 可以立即使请求失败,而不会命中服务器。

通常,算法是在NAME_CACHE条目上设置时间窗口和操作计数限制。 时间范围通常为 2 秒。 因此,如果NAME_CACHE项大于两秒,则匹配将失败,并且请求将转到服务器。 如果请求在服务器上再次失败,则NAME_CACHE条目会用另一个 2 秒的时段进行更新。 如果请求操作计数不匹配,则表示已将一个或多个请求发送到服务器,这可能会使此NAME_CACHE条目无效。 因此,同样,此操作将发送到服务器。

NAME_CACHE结构具有公开给网络微型重定向程序的公共部分、MRX_NAME_CACHE,以及仅供 RDBSS 使用的专用部分。 微型重定向程序部分具有上下文字段 NTSTATUS,用于此名称条目上一个服务器操作的结果,以及一些可与 NAME_CACHE 结构共同分配的其他小型重定向程序特定存储的上下文扩展指针。 有关详细信息,请参阅 RxNameCacheInitialize

对于 Windows 网络,SMB 操作计数是特定于小型重定向程序的状态的一个示例,该状态可以保存在MRX_NAME_CACHE的上下文字段中。 调用 RxNameCacheCheckEntry 时,它将在上下文字段和提供的参数之间执行相等检查,作为在名称缓存中查找匹配项的一部分。 创建或更新NAME_CACHE条目时,网络微型重定向程序的作业会为此字段提供适当的值,并为NAME_CACHE条目提供生存期(以秒为单位)。

NAME_CACHE 结构的专用 RDBSS 部分包含 Unicode 字符串形式的名称、用于加速查找的名称的哈希值、条目的过期时间以及指示服务器是否支持区分大小写的名称的标志。

NAME_CACHE_CONTROL结构管理给定的名称缓存。 它有一个免费列表、一个活动列表和一个用于同步更新的锁。 NAME_CACHE_CONTROL结构还具有字段,用于存储当前分配的NAME_CACHE条目数、要分配的最大条目数的值、用于每个NAME_CACHE条目的任何其他网络微型重定向程序存储的大小,以及统计信息的值 (缓存的更新、检查次数, 返回有效的匹配项,并且当 network-mini-redirector 保存网络操作时) 。 MaximumEntries 字段限制在行为不佳的程序生成大量具有错误文件名且占用大量内存的打开请求时创建的NAME_CACHE条目数。

目前,RDBSS 维护OBJECT_NAME_NOT_FOUND的名称缓存。 对于此名称缓存,将保留一个 2 秒的时段,如果向服务器发送任何操作,该窗口将失效。 当客户端应用程序有一个文件 (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_CONTROL结构关联的所有NAME_CACHE项的存储。

RxNameCacheFreeEntry

此例程释放NAME_CACHE项的存储,并递减与NAME_CACHE_CONTROL结构关联的NAME_CACHE缓存条目的计数。

RxNameCacheInitialize

此例程 (NAME_CACHE_CONTROL结构) 初始化名称缓存。