名称缓存管理

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项提供生存期(以秒为单位)。

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

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 名称缓存管理例程包括:

Routine DESCRIPTION

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结构)。