具体实施方式
典型操作环境
图1示出了本发明可在其上实现的适合的计算系统环境100的示例。计算系统环境100只是合适的计算环境的一个示例,而不是希望建议对于本发明的使用或功能范围的任何限制。计算环境100不应解释为具有关于典型操作环境中所示各组件任何之一或结合的任何依赖性和需求。
本发明可运行于许多其它通用或专用计算系统环境或配置。合适用于本发明的众所周知的计算系统、环境和/或配置的示例包括,但不限于,个人计算机、服务器计算机、手持或膝上型设备、写字板设备、多处理器系统、基于微处理器的系统、机顶盒、可编程消费电子产品、网络PC、小型机、主机计算机、包括任意以上系统或设备的分布式计算环境等等。
本发明可在诸如程序模块的、或由计算机执行的计算机可执行指令的通用环境中描述。通常,程序模块包括例程、程序、对象、组件、数据结构等等,它们完成特定任务或实现特定抽象数据类型。本发明还可在分布式计算环境中实施,其中任务由通过通信网络连接的远程处理设备完成。在分布式计算环境中,程序模块可位于本地和远程两者的、包括存储器设备的计算机存储介质中。
参考图1,实现本发明的示例系统包括以计算机110的形式的通用计算设备。计算机110的组件可包括,但不限于,处理单元120、系统存储器130和连接包括系统存储器在内的不同系统组件到处理单元120的系统总线121。系统总线121可以是几种总线结构类型的任何一或多种,包括存储器总线或存储控制器、外部设备总线,和使用多种多样总线结构的任何一个的局部总线。作为例子,但不是限制,这样的结构包括工业标准结构(ISA)总线、微通道结构(MCA)总线、扩展工业标准结构(EISA)总线、视频标准协会(VESA)局部总线,和外设部件互连(PCI)总线,它也被称为中间层(Mezzanine)总线。
计算机110一般包括多种多样的计算机可读介质。计算机可读介质可以是任何能由计算机110访问的可用介质,且包括易失的和非易失的介质及可移动的和不可移动的介质。作为例子,而非限制,计算机可读介质可包括计算机存储介质和通信介质。计算机存储介质包括在任何用于信息存储的方法或技术中实现的易失的和非易失的、可移动的和不可移动的介质,信息存储诸如计算机可读指令、数据结构、程序模块或其它数据。计算机存储介质包括,但不限于,RAM、ROM、EEPROM、闪存或其它存储器技术、CD-ROM、数字通用盘(DVD)或其它光存储、盒带、磁带、磁盘存储器或其它磁存储设备,或者任何其它能被用于存储想要的信息和能由计算机110访问的介质。通信介质一般包含计算机可读指令、数据结构、程序模块或调制数据信号中的其它数据,诸如载波或其它传输机制,并包括任意信息传输介质。术语“调制的数据信号”指具有以这样一种关于编码信号中信息的方式设置或改变的一或多个特征的信号。作为例子,但不是限制,通信介质包括有线的介质,诸如有线网络或直接线连接,以及无线的介质,诸如声音的、RF(射频)、红外线和其它无线介质。上述各项的任意组合也应包括在计算机可读介质的范围之内。
系统存储器130包括以诸如只读存储器(ROM)131和随机访问存储器(RAM)132这样的易失的和/或非易失存储器的形式的计算机可读介质。基本输入/输出系统(BIOS)133,包含帮助在计算机110内各部件之间传送信息的基本例程,诸如在起动期间,一般被存储于ROM131。RAM132一般包含由处理器单元120立即访问的和/或目前所运行的数据和/或程序模块。作为例子,图1示出的操作系统134、文件系统135、应用程序136、其它程序模块137和程序数据138。
计算机110还可包括其它可移动的/不可移动的、易失的/非易失的计算机存储介质。作为例子,图1示出用于从不可移动的非易失的磁介质读写的硬盘驱动器141、用于从可移动的非易失的磁盘152读写的磁盘驱动器151,以及用于从诸如CD-ROM或其它光介质的可移动的非易失光盘156读写的光盘驱动器155。其它可用于典型操作环境的可移动/不可移动的、易失/非易失的计算机可读介质包括,但不限于,磁带、闪存卡、数字通用盘、数字录像带、固态RAM、固态ROM等等。硬盘驱动器141一般通过诸如接口140的不可移动存储器接口连接到系统总线121,而磁盘驱动器151和光盘驱动器155一般都由可移动存储器接口诸如接口150连接到系统总线121上。
磁盘驱动器及其关联的计算机可读介质,以上讨论并示于图1,为计算机110提供计算机可读指令、数据结构、程序模块和其它数据的存储。在图1中,例如,示出硬盘驱动器141存储了操作系统144、应用程序145、其它程序模块146和程序数据147。注意,这些组件能够相同或不同于操作系统134、应用程序136、其它程序模块137和程序数据138。这里给操作系统144、应用程序145、其它程序模块146和程序数据147以不同的数字以说明他们至少是不同的拷贝。用户可通过诸如手写板(电子数字化仪)164、话筒163、键盘162和定位设备161,通常指鼠标、跟踪球或触摸垫这样的输入设备将命令和信息键入计算机110。其它输入设备(未示出)可包括操纵杆、游戏垫、卫星天线、扫描仪或类似的设备等。这些或其它输入设备通常可通过连接到系统总线的用户输入接口160连接至处理器单元120上,还可通过其它接口和总线结构连接,诸如并行接口、游戏端口或通用串行总线(USB)。监视器191或其它类型的显示设备也能通过诸如视频适配器190的接口连接至系统总线121。监视器191还可与触摸屏面板或类似的部件集成在一起。注意,监视器和/或触摸屏面板能够物理地连接到一个机箱上,其中计算设备110是一体化的,诸如平板型个人计算机。此外,诸如计算设备110的计算机还可包括其它外围输出设备,诸如扬声器195和打印机196,它们可通过输出外围接口194或类似的接口连接。
计算机110可在一个使用逻辑连接至一或多个远程计算机诸如远程计算机180的网络化环境中运行。远程计算机180可以是个人计算机、服务器、路由器、网络计算机、对等设备或其它普通的网络节点、游戏控制台等等,并且一般包括上面相对于计算机110所述的部件的许多或全部,尽管在图1中只示出存储器设备181。图1中所示的逻辑连接包括局域网(LAN)171和广域网(WAN)173,但还可包括其它网络。这样的网络环境在办公室、企业级计算机网络、企业内部互联网和因特网中是很普通的。例如,在本发明中,计算机系统110可包括源计算机,数据从它迁移,而远程计算机180可包括目的计算机。但注意源和目的计算机不需要通过网络或其它方式连接起来,相反,数据可通过能够由源平台写入并由一或多个目的平台读取的任何介质迁移。
当在LAN网络环境中使用时,计算机110通过网络接口或适配器170连接至LAN171。当在WAN网络环境中使用时,计算机110一般包括调制解调器172或用于建立在WAN173诸如因特网上的通信的其它工具。调制解调器172,可以是内置的或外置的,可通过用户输入接口160或其它适当的机制连接至系统总线121。在网络化环境中,相对于计算机110所述的程序模块,或其一部分,可存储在远程存储器设备中。作为例子,但不是限制,图1示出远程应用程序185为驻留在存储设备181上。将意识到所示的网络连接是典型的,并且可使用用于在计算机之间建立通信链路的其它方法。
客户端高速缓存系统和方法
将在Microsoft(微软)公司的WindowsXP操作系统背景中描述本发明,使用基于协议的重定向器,NTFS文件系统和其它组件,(例如,I/O管理器,高速缓存管理器和存储器管理器)。尽管如将理解的,事实上可用任何操作系统和/或文件系统实现本发明。
转到附图的图2,在这里示出用于实现本发明的示例结构200,其中用户模式应用程序202可通过应用编程接口(API)层204调用各种系统功能。对于访问网络资源,应用程序202通过I/O管理器206进行指向网络资源的文件输入-输出(I/O)API调用。例如,在基于Windows的操作系统中,应用程序能通过使用UNC(统一命名协定)标准与Win32功能以直接寻址远程资源,例如以\\server\share的形式或者通过映射到网络共享文件夹等等的驱动器字母,检查或访问在远程系统上的资源。
应用能访问网络资源的另一种方法是通过调用网络API,(例如,Windows2000操作系统中Win32窗口网络(Win32 Windows Networking)(WNet)API),诸如有关在浏览时列举服务器的文件。通过这些WNet API,应用和/或操作系统能列举远程计算机输出用于共享的计算机和资源。为此,用户模式网络提供器210-213每一个包括软件代码,软件代码建立操作系统作为远程网络服务器的客户,在本发明中,作为客户端高速缓存的客户(通常充当服务器)。例如,网络提供器执行的有些操作包括建立和断开网络连接和查询网络资源状态。因此,由网络提供器提供的典型功能包括性能功能和设备重定向功能,性能功能允许调用者确定网络提供器的性能,设备重定向功能允许网络提供器重定向驱动器字母、MS-DOS设备和LPT端口。其它功能包括提供器专用的对话功能、管理功能和列举功能,对话功能允许网络提供器显示或表现网络专用的信息,管理功能允许网络提供器显示或表现专用的网络目录,列举功能允许浏览网络资源。例如,通过SMB网络提供器211,操作系统能列举在SMB服务器311(图3)上的网络共享。
在一个实现中,当应用程序调用API204的网络例程时要确定要调用哪个网络提供器,该调用传递至多个网络提供器路由器或MPR216,可作为动态链接库(DLL)安装MPR216。通常,MPR216确定哪个用户模式网络提供器识别正在访问的资源。为此,在MPR216下每个安装的网络提供器提供集中地被称为网络提供器接口的一组功能,网络提供器接口允许MPR216确定应用正在尝试访问哪个网络,以及将请求指向合适的网络提供器软件。例如,用于SMB的网络提供器包括LANMAN(局域网管理器)网络提供器211,如在系统注册表项等等中规定的。
在所述的实现中,当被调用以连接远程网络资源时,MPR216检查注册以确定载入哪个网络提供器。MPR216随后轮询它们,诸如按照在注册中列出它们的顺序每次一个,哪个是可配置的,以及每个网络提供器(例如,DAV网络提供器213)可进一步与相应的内核模式组件(例如,DAV重定向器225)通信,直到资源被识别或者直到可用的网络提供器已经被轮询。因此,在指向网络资源的网络API调用的事件中,例如,通过作为调用参考传递至DAV服务器的URL,MPR216将轮询DAV网络提供器213,它依次通过RPC(远程过程调用)调用到一服务中以与内核模式DAV重定向器225联系以判定是否能处理这个API,例如所指定的DAV共享是否确实是可访问的DAV服务器312(图3)。如果是,则由DAV重定向器组件225处理这个API。
应用也可透明地通过UNC名字或先前映射到资源的驱动器字母访问网络资源。当用远程路径/文件名诸如UNC名字调用文件I/O API(例如文件创建/打开请求),这个文件I/O在I/O管理器206被接收。要处理这个远程名字,I/O管理器206调用多重UNC提供器或MUP230,(例如,包括内核模式驱动器)它是作为UNC提供器向系统注册的。通常,MUP230算出哪个网络提供器(例如,提供器210-213组中的)和相应的内核组件诸如网络重定向器223-225中的一个处理那个具体的名字。注意,在本例中只示出三个重定向器,然而在一给定系统中更少或更多数量的重定向器是可行的。
要为所请求的文件创建路径确定正确的重定向器,MUP230实际上轮询已注册的提供器/重定向器,直到一个提供器/重定向器声明这个创建请求中所提供的路径。在一个实现中,MUP230通过异步I/O请求分组或IRP轮询,并且每个能处理这个名字的重定向器应答回来。如果多于一个肯定地应答,则MUP230根据优先级顺序(例如,至少在一个系统注册表项等等中保存的)确定哪一个具有处理该请求的优先权。一旦该路径被声明,当应用程序202使用一I/O API访问该远程文件时,MUP230知道要调用哪个重定向器处理请求。
当至少一个重定向器应答并高速缓存这个路径时,MUP驱动器230高速缓存与应答的重定向器相关联的路径信息,(如果多于一个,它高速缓存具有优先权的那个的信息),由此在没有轮询操作的情况下,将以那个路径串开始的更多的请求直接送到那个重定向器。注意,作为对MUP206的应答的部分,识别该名字的每个重定向器指示该名字对于其的唯一性程度。例如,如果该名字是UNC名字\\SERVER\SHARE\foo\barl.doc并且SMB重定向器223将该名字识别为能够处理,以及如果服务器是SMB服务器,则SMB重定向器223通过高速缓存串“\\SERVER\SHARE”为其自己的。因此,将来指向相应于这个被高速缓存的串的网络共享的SMB请求在不轮询的情况下被传递至SMB重定向器223,以及SMB重定向器223将那些SMB请求分组成能够通过网络送到远程SMB服务器的数据结构。
依照本发明的一个方面,在合适的时候,客户端高速缓存(CSC)机构221以代理提供器的形式在重定向层次上透明地处理来自CSC离线存储器215的网络请求,与任何特定的网络协议无关。在一个实现中,CSC机构221从开始起被包括在通信的流中。为此,当收到UNC或基于驱动器字母的网络I/O请求时,MUP230通过对CSC预处理处理器226的预处理调用,与CSC机构221通信。CSC机构221从预处理调用用状态信息返回,如下所述。例如,如果预处理处理器226知道连接是离线的,即,对于这个文件在创建时没有连接到网络,则客户端高速缓存(CSC)代理提供器221可声明路径并用成功状态完成这个调用。否则,CSC可返回“要求更多的处理”状态,在该事件中,MUP230同样地在调用(调用)一或多个重定向器215-217之前,放置对分布式文件系统(DFS)代理提供器216的一个预处理调用。注意,CSC机构221能以已知的方式确定网络连接状态(象其它组件一样),诸如通过检查现有的连接数据状态,注册涉及网络的事件等等,如由连接状态250在图2中一般表示的。
CSC机构221因此为指向网络的任何UNC和基于驱动器字符的I/O接收预处理调用。注意,要由MUP230调用的CSC机构221将其本身注册为一代理提供器,由此MUP230知道为指向网络提供器和/或它们相应的重定向器的IRP和FASTIO调用,用预处理调用以及还有后处理调用来调用CSC机构221。
在用返回要求更多处理状态的预处理调用CSC机构221之后,MUP230调用DFS代理提供器218。通常,DFS将一逻辑路径/文件名转换成物理路径/文件名,并提供建立在许多不同服务器之外的一个单一的、统一的名字空间的系统。然后重定向器能为这个特定的重定向器处理的文件声明合适地命名的路径。在一高层次上,DFS通过在响应结点(junction point)时向包括DFS名字空间的独立服务器请求参考(referral)来工作。作为例子,DFS可被用于为一程序的版本提供一单一的名字空间,它由遍及一个部门(division)的不同的服务器建立的,例如,名字\\progbuilds\release\lab01\release\x86fre是到\\robvbl1\release的一个结点。在这个例子中,要打开\\progbuilds\release\lab01\x86fre\latest_tested_build.txt,\\progbuilds服务器将返回参考为\\robvbl1\release\latest_tested_build.txt并告诉客户再尝试这个请求。
如能理解的,处理结点的一般算法修改名字的左边部分。一个名字能经过多个结点,在最终联系目的地服务器之前,导致多个名字修改。正当服务器改变客户提供的名字以处理结点时,将文件名标识符放到右边允许该标识符保存在名字中。
因此,在图2的结构中,并且也如在图3中一般表示的,在MUP230作为UNC提供器注册的情况下,由MUP230产生UNC调用,它接着将它们传递给合适的代理提供器中的第一个,即CSC机构221。取决于返回的状态,MUP230可将UNC调用传递到一或多个其它代理提供器(例如222),以及到重定向器223-225,这些重定向器通过网络传输层301等等与相应于重定向器的协议的服务器311-313通信数据。因为预处理和后处理调用方案,CSC机构221过滤通过MUP230的调用,因而允许CSC机构221有能力对用于被认为合适的无论什么路径名的高速缓存操作作出决定。在概念上,CSC机构221在MUP230处理的每个调用的路径中,允许CSC机构221进行CSC机构221需要的无论什么预处理和后处理,以执行合适的客户端高速缓存功能,如下面一般描述的。而且,在这个结构中,因为CSC机构221在DFS代理提供器222之前操作预处理调用(和在DRS之后操作后处理调用),任何DFS操作对于CSC是透明的,如CSC机构221看到的名字是逻辑名字而不是物理名字。如在图2的结构中表示的,CSC机构221和DFS代理提供器222是在MUP230的一般层次上。
依照本发明的另一个方面,客户端高速缓存功能是协议无关的,例如,它与任何重定向器一起工作。为此,客户端高速缓存功能已经移出任何协议相关的重定向器(即SMB重定向器223),并且透明地成为重定向器和重定向的缓冲子系统232之间的控制流的部分。如已知的,重定向的缓冲子系统232向重定向器223-225提供高速缓存管理器240和存储器管理器242(内存储RAM高速缓存242)服务,这些重定向器每个与RDBSS232联系以在合适的时候利用内存储高速缓存244。通过将CSC机构221(作为驱动器)插入到重定向器与重定向的缓冲子系统232之间的控制流中,使客户端高速缓存功能作为公共服务可用于每个重定向器,与任何网络协议无关,但本质上透明于重定向器223-225和重定向的缓冲子系统232。注意,如在此使用的,术语“缓冲服务”指处理涉及文件的数据缓冲的任何组件,包括由本示例结构中的RDBSS232、高速缓存管理器240、存储器管理器242和RAM高速缓存244集中地提供的缓冲服务。
应该注意,CSC机构221在逻辑名字空间上操作,这个名字空间是用户看见的名字空间。注意,这和重定向器相反,重定向器在物理名字空间上工作,这个名字空间相应于存储数据的实际服务器。注意,这两个名字空间例如对于SMB是相同的,除非存在包含的DFS结点。
依照本发明的一个方面,图4表示在逻辑和物理名字空间两者中基于逻辑连接的数据结构400和基于物理连接的数据结构420,以及两者之间的关系。注意,CSC机构221在逻辑名字空间中保存基于连接的数据结构400,同时每个重定向器在物理名字空间420中保存其基于连接的数据结构。
通常,当MUP230接收一创建文件请求并调用CSC预处理处理器226时,CSC机构221创建逻辑连接数据结构400和共享的基于文件的结构410-412。注意,由I/O管理器206(图2)创建文件对象413。而且,注意,服务器能禁止客户端高速缓存,其中客户端高速缓存机构将通过其后处理处理器227检测。
CSC的逻辑连接数据结构400包括服务器调用上下文421,它包括服务器的抽象(abstraction),例如,包括逻辑服务器名字、CSC设备对象、CSC状态标志、连接状态和清除器管理器。(至少一个)网根(net root)结构402每个包括共享的抽象,包括共享名字、共享类型、CSC属性、访问权限、打开的数量等等。(至少一个)网根的视图结构(VNetRoot)403每个包括共享的视图的抽象,包括安全的上下文和用户会话信息。
如在图4中所表示的,共享的数据结构包括文件控制块410,连同至少一个服务器端打开上下文411,以及至少一个文件对象扩展412。文件控制块410实质上包括文件的抽象,并且包括用于文件的信息,诸如大小数据、时间信息、高速缓存映象等等。服务器端打开上下文411包括送到服务器的打开的抽象,即具有所希望的和共享的访问权限的服务器文件句柄。注意,CSC机构221象在这个上下文中的服务器,例如,在CSC存储器215中文件的句柄将被保存在这个结构中。文件对象扩展数据结构412包含与文件对象413相关联的信息。
如在图4中所示的,当系统在线且允许客户端高速缓存,在CSC机构221和声明路径的重定向器之间共享这些数据结构410-413。结果,文件I/O请求由或者CSC机构221或者声明文件的路径的重定向器执行,基于下面所述的情况。
在相应于图2的结构的一个实现中,当一创建请求来到MUP230时,MPU230调用CSC机构221的预处理处理器226(入口点)。CSC机构221试图找出用于随这个创建请求发布的文件对象的逻辑连接数据结构(服务器调用上下文401服务器连接结构,网根共享映射结构402和每用户共享VNetRoot映射结构403)。如果没有找到,CSC机构221创建这些结构,例如,通过RDBSS232。如果知道这些连接是离线的,则CSC预处理处理器226返回成功状态,(或如果适当返回错误),否则CSC预处理处理器226返回“要求更多处理”状态,由此MUP230将调用DFS代理提供器的预处理,并且然后调用一或多个重定向器223-225以试图打开路径。
在路径的成功打开(连接在线)时,在适当的重定向器处建立基于连接的物理结构420,以及可用于文件的句柄。MUP230调用CSC后处理处理器227,它通过查看FCB的物理网根,能获得路径的文件扩展、大小和高速缓存标志。一旦获得这个信息,CSC机构221能(在其后处理中)决定是否要拥有这个文件对象,例如,如果共享指示允许为这个文件高速缓存(文件是可高速缓存的共享,或者如果重定向器指示高速缓存将一直开着,诸如用于WebDAV)。如果允许,CSC机构221声明所有权并完成用于由这个文件对象表示的打开实例410-412的文件数据结构。如果共享被标记为不可高速缓存的,CSC机构221将它自己与文件对象解除关联,可清除任何CSC数据结构,并且其后将见不到对于这个文件对象的操作。在图5中一般表示用于这样一个客户端高速缓存禁止模式的操作的其余数据结构。注意,CSC机构221在有些时间段保存连接数据结构,即使连接数据结构是不可高速缓存的路径。相反,当允许客户端高速缓存但对于这个路径连接是离线的时候,不存在用于这个物理连接的数据结构,如在图6中一般表示的。
注意,服务器可指示(通过锁定机构等等)对于这个文件的操作应该由客户端高速缓存处理,直到受到其它指示,例如,直到服务器改变锁定的类型。在文件上的后续I/O操作将被离线执行,直到受到其它通知,例如,服务器改变锁定的类型(例如,机会锁定(opportunistic lock),或oplock),因为另一个用户已经请求访问这个文件。
转到参考图7-13的流程图的本发明的操作说明,图7表示图2的示例结构中MUP230、CSC和DFS代理提供器(分别为221和222)与重定向器223-225之间的一般控制流。如在步骤700表示的和如上所述的,在一创建请求上,MUP230选择代理提供器中的第一个,在本例中是CSC机构221,通过步骤702逻辑地跟踪预调用顺序,并在步骤704调用(invoke)(调用(call))所选择的提供器预处理处理器。下面参考图9一般描述用于创建请求的CSC预处理处理器226操作。除非被调用的代理提供器以“成功”或“错误”状态代替“要求更多处理”状态完成这个请求,如在步骤706所检测到的,MUP230将通过步骤708和710(它循环回到步骤702)调用其它代理提供器,在这个例子中只有DFS代理提供器222,直到没有要调用的代理提供器剩下。注意,在CSC机构221检测到连接离线的情况下,(例如,通过在如图4所表示的数据结构中的连接状态数据250(图2)),CSC机构221离线地处理文件I/O创建请求,并且然后返回除要求更多处理之外的状态,即成功或错误,因此没有涉及网络的组件需要访问。
在一个在线(或未知的连接状态)情况下,在预处理调用代理提供器之后,步骤708分支到表示调用重定向器或多个重定向器的步骤712。注意,在文件创建/打开请求上,如上面所述,可调用的多个重定向器以找出声明路径的一个重定向器,除非用于这个创建的路径已经先前被声明,由此MUP230知道要调用哪个重定向器。在涉及那个路径的后续的I/O请求上,包括被指向读或写操作的那些请求,MUP230调用先前声明路径或声明它为创建/打开请求的部分的重定向器,例如,对于这个例子而言的DAV重定向器225。
图8表示MUP230调用代理提供器的后处理处理器,在预处理调用(或多个调用)以及对重定向器的任何调用之后。在步骤800,MUP选择以预处理调用顺序最后被调用的代理提供器,它在(在线)本例中是DFS代理提供器218,并且在步骤802调用它。步骤804和806表示以与后处理调用顺序的相反顺序重复用于其它代理提供器的后处理。在本例中,剩下要被调用的代理提供器只有CSC机构221。下面参考图10一般描述用于创建请求的CSC后处理处理器227操作。注意,在离线情况下,步骤706将分支到步骤712,只有CSC预处理处理器226已经被调用,由此步骤802将调用CSC后处理227但将不存在其它要调用的代理提供器,如由步骤804检测到的。
图9表示CSC预处理处理器226的操作,当被MUP230调用以响应创建请求时。在步骤900开始,CSC预处理找出或创建逻辑结构400,如上面参考图4一般描述的。步骤902表示与文件对象413相关联的共享的结构410-412(图4)的折叠(collapsing)或创建。注意,如同其它服务器文件一样,以正确的顺序(同步的)挂起任何指向同文件的创建/打开请求,如由步骤904所表示的,例如,因此在不被送到服务器的这个打开上,后续的打开可被折叠。步骤906测试是否知道连接离线,在这个事件中只有CSC存储器215可用,并且不需要涉及网络资源,由此预处理处理器分支到步骤908以返回功能(或错误)。否则,预处理处理器分支到步骤910以返回“要求更多处理”状态,使得将联系涉及网络的组件(DFS和重定向器),它将建立在线或离线状态,如上所述。
应该注意,在文件的创建/打开请求处理时为每个文件建立在线或离线。如果从其它创建请求中知道,则可在CSC预处理中确定离线连接,或者如果在CSC预处理期间不知道,则在CSC后处理中基于当重定向器或多个重定向器被调用时所发生的确定离线连接,如下所述。例如,如果重定向器声明路径,创建结构并不返回网络错误,则建立在线连接,否则建立连线连接。在一个实现中,在创建时确定的离线对在线状态对于文件不会改变(直到被关闭和重新打开),不管在后续I/O请求期间的实际连接状态。因此,即使在文件创建/打开时网络是在线的,但在打开文件时变成离线,则MUP230继续将用于那个路径的请求传递至重定向器,如下所述。注意,因为缓冲服务和/或客户端高速缓存,在处理这样的后续请求中可能没有错误,除非实际上需要重定向器与断开的服务器通信。可供选择,如果在文件创建/打开时网络是离线的,但在打开文件时变成在线,客户端预处理继续处理请求,好象离线一样,举例来说因为MUP230还没有涉及DFS且对于这个文件没有MUP230已知的重定向器。
图10表示CSC后处理处理器227的操作,当被MUP230调用以响应创建请求时,如果离线可在预处理调用之后立即进行,或者如果不知道连接状态,在已经调用重定向器(以及其它代理提供器或提供器)之后进行。注意,尽管在图10中未示出,如果在涉及(至少一个)重定向器之后,由服务器对这个文件禁止客户端高速缓存,CSC机构221将通过后处理基本上移除自己,用于指向这个文件的进一步调用。
在步骤1000开始,CSC后处理处理器227创建用于客户端高速缓存文件的句柄,例如,如由在CSC存储器215中用于文件的本地文件系统返回的。如上所述,文件结构中的一个包括服务器端打开上下文411(图4),其中在步骤1002CSC后处理处理器227存储这个句柄,即,CSC后处理处理器227存储用于表示逻辑路径而不是物理路径的本地高速缓存的句柄。在步骤1004,为这个文件完成这些结构,例如,各种数据被放入合适的结构。步骤1006表示释放任何可能挂起的其它创建(在图9的步骤904)。
应该注意,当调用CSC后处理227时,CSC后处理处理器227寻找表示离线情况的涉及重定向器的错误。这处理预处理处理器226不知道连接是在线或离线的情况。为此,CSC后处理227可查看现在是否知道连接是在线的,诸如通过在数据结构中寻找物理连接信息,和/或寻找来自其它代理提供器或重定向器的完成状态。如果存在连接错误,例如,没有重定向器声明路径,后处理处理器将这个文件的状态转移到离线,即,CSC后处理227将在数据结构中的状态转移到离线,因此后续的请求将由CSC预处理处理器(在不涉及任何重定向器的情况下)完成,如下所述。换句话说,随着转移至离线的情况,后续的I/O请求由CSC代理提供器的预处理处理器226完成,(并且CSC将返回不同于要求更多处理的状态),因此MUP230将不发送请求至重定向器(在任何事件中对于MUP230可能不知道这个重定向器)。
步骤1008表示测试连接是否离线,这可能已经预先知道,也可能预先不知道。如果离线,执行步骤1010,它表示执行任何可能必需的转移至离线,诸如清除可能存在的任何基于物理连接的数据结构,等等。如果在线,执行步骤1012,它表示用CSC机构221的参考代替声明路径的重定向器覆写FCB410的分派表(dispatch table)416。
更具体地说,如下面参考图11-13所述,在只轻微地改变成RDBSS232与重定向器一起工作的方式的情况下,本发明的结构已经完成了协议无关的客户端高速缓存。例如,RDBSS232和重定向器组件实际上象以前一样作用,例如,重定向器声明路径,调用到RDBSS232中以查看所需的数据是否被高速缓存在本地存储器中,等等。RDBSS232也基本上象以前一样操作,例如,在被请求时创建结构,调用高速缓存管理器在合适时高速缓存写或查看所请求的数据是否被高速缓存以满足读请求,并且如果是则与数据一起返回,等等。不过,如下所述,当RDBSS232需要文件数据诸如以满足I/O请求而数据不在内存储高速缓存244中时,高速缓存管理器240/存储器管理器242生成读IRP。然而,当这个读IRP到达RDBSS232时,取代将控制传递至重定向器以获得数据,分派表入口的覆写使RDBSS232调用CSC机构221,因此给CSC机构221一个机会使用CSC存储器215满足请求。如此,CSC机构221透明地被包括在RDBSS232与声明路径的重定向之间的控制流中,与重定向器的网络协议无关。
图11-13描述一种方式,其中CSC机构221被透明地插入以截取读请求,特别是当允许客户端高速缓存时。为了简单,图11-13不表示其它操作状态,包括当不允许读高速缓存时;代之以在下面描述这个条件,即,在从持久性存储器215的任何读之前,CSC机构221需要知道文件的缓冲状态,因为如果缓冲状态是不允许读高速缓存这样的,(例如,在一个实现中缓冲状态是与OPLOCK_LEVEL_NONE等价的),那么CSC机构221不从CSC存储器215返回数据,并且代之以让读请求转到下面的提供器。在一个实现中缓冲状态信息,可通过检查在FCB上的FCB_STATE_READCACHING_ENABLED标志获得。
在步骤1100,当MUP230接收请求时,例如来自I/O管理器206的IRP时,整个读请求处理开始。在步骤1102,MUP230调用CSC预处理处理器226,CSC预处理处理器226在通过步骤1104测试在线时,产生在步骤1106返回的“要求更多处理状态”。注意,如果系统是离线的,那么CSC预处理处理器226处理请求,在图11中由步骤1104分支到步骤1112表示。
对于在在线状态中的读请求,当在步骤1106 CSC预处理226返回要求更多处理状态时,在步骤1108 MUP230调用DFS预处理以执行其任何DFS预处理操作,诸如记录文件I/O操作。在这个调用之后,在步骤1110 MUP230调用先前声明用于这个特定文件的路径的重定向器(例如225)。
不管CSC预处理(离线)或重定向器(在线)是否具有请求,在步骤1112调用RDBSS232,基本上确定所需要的数据是否在存储器高速缓存244中,诸如由于先前的读或写请求。当数据没有在本地存在于存储器(高速缓存未中(miss)发生)中时,如下所述,缓冲服务(例如,高速缓存管理器240/存储器管理器242)将生成具有置位的分页I/O标志的第二IRP,主要为了让另一个实体取得数据。因此,RDBSS232将需要检查IRP是否由高速缓存未中条件生成的,例如,通过分页I/O标志设置等等,因为如果这样,意味着RDBSS232不应该另一次重复它先前所做的并且调入高速缓存管理器以查看同一数据,因为在没有找到时这将再次发出IRP,(它实质上将是一个无限的循环)。代替的是,需要调出RDBSS232以从其它地方取回数据。这个测试在步骤1114表示。注意,以不允许缓冲的I/O的方式可打开文件,在这个事件中将同样不高速缓存数据;步骤1114也能检测这个条件并相应地分支到步骤1118。为了简单,将参考缓冲的I/O描述本例,除在另有说明的地方。
在本例中,在这时,IRP是由I/O管理器206生成的,并且因此步骤1114分支到步骤1116,调用高速缓存管理器240,它接着与存储器管理器242一起在内存储(RAM)高速缓存244中查找所请求的数据。图12的步骤1200表示高速缓存管理器240/存储器管理器242作出关于是否存在高速缓存命中或高速缓存未中的判定,缓冲数据(步骤1202)并在高速缓存命中时返回成功(步骤1212)至RDBSS232,或者在高速缓存未中时生成第二IRP,如由步骤1204表示的。在第一IRP中的高速缓存命中时,RDBSS232完成这个(第一)IRP,如在步骤1240所表示的并且如在下面参考图13一般描述的。在高速缓存未中时,在步骤1204生成第二IRP,且与第一IRP相似,在图11的步骤1100,在MUP230处接收。
回到图11,如果和当在步骤1100接收第二IRP时,如上所述将执行其它步骤(例如,1102-1112),最后到达步骤1114,再次与是否离线或在线无关。不过这次,步骤1114将检测用于读的这个(第二)IRP的分页I/O标志。
依照本发明的一个方面和如上所述,当在线时,在用于文件创建/打开请求的CSC后处理中,CSC后处理处理器117已经预先覆写FCB410的分派表416中的重定向器指针(图4),因此RDBSS232将在这个情况下调用CSC机制221,如通过步骤1118所表示的,代替重定向器225。这给CSC机构221一个机会在CSC存储器215中查看所请求的数据,代替首先让重定向器225向服务器请求数据。注意,这对于RDBSS232是透明的,RDBSS232简单地基于FCB的分派表416中的指针调用CSC机构221。如此,从重定向器的观点CSC机构221基本上象对RDBSS232的扩展作用,可是从RDBSS232的观点它象适当的重定向器作用,尽管对于两者基本上是透明的。而且,注意在离线情况下,CSC预处理处理器226调用RDBSS232(没有重定向器被涉及),以及因此在步骤1118 RDBSS232将回调CSC预处理处理器226。因此,在或者在线或者离线的情况下,CSC机构221的代码得到调用。
如此,在高速缓存未中时,执行图12的步骤1220,它表示CSC机构221为所请求的数据检查其持久数据存储器215。注意,除非文件是不足的(sparse),所请求的数据将在那里,以及因此步骤1220能包括有关文件是不足的测试,(可供选择,如果是不足的,步骤1220能测试所请求的数据是否正好存在)。如果找到,从RDBSS232的观点CSC机构221象重定向器作用,如CSC机构221将检索RDBSS232不能从本地存储器获得的数据,并在步骤1222在响应调用时返回数据,例如,通过将数据填充到与IRP相关联的缓冲器中并向RDBSS232提供成功状态,如由步骤1222所表示的。RDBSS232完成这个第二IRP,如由步骤1240所表示的和下面参考图13所述的(在步骤1206它将返回到启动器(例如,高速缓存管理器240/存储器管理器242),下面所述)。
如果在步骤1220 CSC机构221不能访问所请求的数据,那么如果在线,CSC机构221可请求重定向器(例如,225)从服务器获得数据。不过,如果由步骤1224检测到离线,则CSC机构221将需要返回错误(例如,指示网络是断开的)至RDBSS232。注意,这象任何重定向器如果先前在线但被断开时将返回的错误一样;再次从RDBSS232的观点CSC机构221仿效重定向器。为此,在步骤1226 CSC机构221调用重定向器225,好象CSC机构221是RDBSS232。然后,重定向器225与合适的服务器通信以试图检索所请求的数据,如由步骤1228所表示的。如果读是成功的,数据是由重定向器缓冲的(在与IRP相关联的缓冲器中),重定向器返回成功至CSC机构221,(好象CSC机构221是RDBSS232),由此在步骤1232 CSC机构221高速缓存在CSC持久性存储器215中的数据,并在步骤1240向RDBSS232提供成功状态以完成IRP。注意,如果读是不成功的,没有东西可用于CSC机构221高速缓存,以及因此只由重定向器返回错误状态至CSC机构221,并且由CSC机构221至RDBSS232。
随着步骤1240,所完成的IRP(是成功还是不成功地完成的,以及是第一还是第二IRP)因此移动退出驱动器堆栈,它到达MUP230。不过,IRP移动所通过的堆栈顺序是不同的,取决于连接是在线或离线。注意,在这时没有实际测试离线对(versus)在线,但是步骤1300在概念上表示通过堆栈的两个可能的路径,IRP可取决于离线对在线利用这个堆栈。例如,在在线情况下,IRP将从RDBSS232移动至重定向器至MUP230,如由步骤1302和1308所表示的。注意,重定向器简单地将IRP传递至MUP230。
可供选择,在离线情况下,MUP仅调用了CSC预处理226,它接着调用RDBSS232。因此,IRP被返回至CSC预处理226,如通过步骤1304所代表的。CSC预处理226接着返回状态完成(或错误)至MUP,如通过步骤1306和1308所表示的。如此,尤其,MUP230将不调用重定向器,如上面参考图7所述。
步骤1310表示MUP230测试状态,以便开始调用代理提供器的后处理,如上面参考图7和8所述的。注意,当状态是成功(或错误),这一般相应于分支到图8的图7的步骤706,尽管在图13的例子中,唯一的其它代理提供器是DFS代理提供器222。因此,当在线时,在步骤1312 MUP230调用DFS代理提供器222的后处理处理器,以及然后在步骤1314调用CSC后处理处理器227,并且在步骤1316完成请求。否则,当离线时,MUP仅调用CSC后处理处理器227。应该注意,在步骤1310 MUP不需要实际地测试在线对离线,因为这个测试在后处理调用堆栈中可能是固有的,即,基本上相应于图8的步骤806,当只有CSC后处理要回调时。
MUP230接着完成请求,如由步骤1316所表示的。不过,返回IRP的情况,取决于IRP是由I/O管理器206启动的第一IRP,或者是由高速缓存未中启动的第二IRP。如果IRP是第一IRP,它被送往至I/O管理器206,以及在响应应用程序的读请求时从那里返回数据。如果IRP是在步骤1204产生的第二IRP,接着这个第二IRP返回至高速缓存管理器240/存储器管理器242,即,在步骤1206生成它的实体。
步骤1206表示测试在第二IRP(高速缓存未中条件)中产生的读请求是否成功。如果否,在响应来自应用程序的API调用时,与第一IRP一起返回错误(步骤1208)至I/O管理器206,如上面参考步骤1240和图13所述。如果读是成功的,则代之以执行步骤1210,它表示高速缓存管理器240/存储器管理器242用通过第二IRP读请求缓冲的数据填充存储器高速缓存244。然后将第一IRP与所填充的数据缓冲器一起返回至I/O管理器206(以从那里至应用程序),如上面参考步骤1240和图13所述。
如此,RDBSS232和重定向器从它们的观点象以前一样操作,然而CSC机构221透明地将自己插入到控制流中以在内存储高速缓存没有数据时满足读请求。注意,当内存储高速缓存244具有数据时,(高速缓存命中),CSC机构221不需要将数据添加到其存储器215,因为在步骤1210通过第二IRP数据首先进入内存储高速缓存244,并且因此从CSC存储器215获得或已经在如上所述的步骤1232由CSC机构221(从重定向器)存储。因此没有必要再复制这个数据至CSC存储器215。
转到考虑当允许客户端高速缓存时的写请求,写请求与读请求非常相似,除了高速缓存管理器240/存储器管理器2442最后改变在存储器高速缓存244中的数据。所改变的存储器高速缓存244(例如,所考虑的改变或不在每页的基础上)让其所改变(弄脏的)页被刷新至CSC存储器215和/或服务器,以下面所述的各种方式。注意,要为写请求在内存储高速缓存244中改变数据,要被改变的每个数据页(即使只改变页的部分)必须在内存储高速缓存244中。因此,在此所述的示例实现,在用于写请求的高速缓存未中时,通过生成第二IRP(例如,就象在步骤1204用于读请求那样)所需要的数据首先被读入高速缓存。
通常,对于缓冲的I/O(它使用高速缓存240),图11-13的流程图和读一样应用于写,除了代替填充缓冲和返回它,填充要写的数据的缓冲器修改在高速缓存240中适当的页,不是那些页开始在高速缓存240中,就是必须通过上面所述用于读第二IRP机构,将所需的页发现缺少(fault)(读)到高速缓存240。注意,对于非缓冲的I/O,RDBSS232知道不调用高速缓存管理器240(例如,基于在创建时放置在FCB中的信息),以及代之以将调用CSC机构221,例如,当在线时通过分派表或者当离线时回到CSC预处理。因此,非缓冲的I/O写基本上在第一IRP时通过图11中的步骤1114分支到步骤1118,相似于第二分页I/O IRP。
当在实际的写请求中涉及CSC机构221时,(以及不只是在高速缓存未中时生成的读求以填充内存储高速缓存244用于相应的写请求),例如,对于非缓冲的I/O或当高速缓存被刷新时,写操作可由用作直写高速缓存的CSC机构221处理。通常,用直写高速缓存,数据首先被试图写到服务器,并且如果成功,那么CSC机构221将拷贝到其持久性存储器215。例如,如果禁止写高速缓存或文件是不足的,CSC机构221将写请求直接送到重定向器,并且如果请求由重定向器成功地完成,然后数据可由CSC机构221保存,通过将拷贝写到其持久性存储器215。如果从重定向器返回错误,CSC机构221可尝试转移至离线,并且如果成功,完成请求离线。
在一个选择方案中,CSC机构221能代替用作反写高速缓存,通过高速缓存不首先到服务器的写。注意,反写高速缓存是由服务器控制的;换句话说,当服务器准予写高速缓存时,CSC机构221将高速缓存写,直到关闭文件句柄或服务器打破文件的oplock(机会锁定)(它准予反写高速缓存特权)。为此,如果允许写高速缓存且文件不是不足的,则CSC机构221将所请求的数据写入CSC持久性存储器215,并返回成功状态(如果不成功则错误)至调用者。注意,在执行每个写之前,CSC机构221确定文件的缓冲状态。如果缓冲状态允许反写高速缓存,CSC机构221将数据写到其持久高速缓存215,并且如上所述返回写状态(通常成功)。不过,如果缓冲状态是不应该高速缓存写这样的,例如,服务器在相当于OPLOCK_LEVEL_II或更低处设置oplock,那么CSC机构221不高速缓存写并且代之以让写请求转到下面的重定向器,如上面一般所述。可通过检查FCB的FCB_STATE_WRITECACHING_ENABLED标志获得缓冲状态信息。
当关闭文件时,关闭请求以上面所述的一般方式通过RDBSS232到达高速缓存管理器240。如果在高速缓存244中的数据需要被刷新,例如,在高速缓存244中至少有一个用于这个被关闭的文件的被弄脏的页,则高速缓存管理器240/存储器生成至少一个分页I/O写请求(IRP或多个IRP),每个请求以如上所述相同的一般方式到达CSC机构211,例如,当RDBSS232接收每个写IRP时,通过来自RDBSS232的调用。CSC机构211然后基于为这个文件接收的每个IRP写到持久CS高速缓存215。
要反写至服务器,在一个实现中,当关闭请求来到CSC机构211,SC机构211检查是否有来自先前关于这个文件的写请求的任何高速缓存的数据。如果是,且如果服务器是在线的,CSC机构211将具有被修改的数据的部分(例如弄脏的页)送回服务器,通过将写请求传递至适当的重定向器。在如此将高速缓存的数据推回服务器之后,CSC机构211将关闭数据送回重定向器。一旦重定向器完成关闭请求,CSC预处理处理器226查询以获得来自服务器的时间信息,将它设置在高速缓存的文件,关闭高速缓存文件句柄,并且返回至MUP230。因此可高速缓存写,直到关闭文件,在这时如此同步文件。注意,当没有文件的远程句柄时,例如,与这个文件相关联的连接是离线的,只在本地执行关闭请求。稍后可执行同步。
如可容易地理解的,现有的应用程序可不修改地与本发明一起工作,并象以前一样发送文件I/O请求。然而,其它应用程序可能知道客户端高速缓存。这样的知道CSC的应用将改进整个用户技巧,诸如通过使用涉及CSC的API控制文件分组,确保某些文件总是在持久性存储器215中(“钉住的”),控制同步频率和访问其它CSC特征。
而且,在一个实现中,CSC机构221可能知道网络连接状态特性,诸如可用性,费用和速率。如能够理解的,可依照在给定时间的当前网络连接特性控制客户端高速缓存、同步和网络通信的其它方面。
如从前面详细的描述中能看到的,提供一种透明地提供协议无关的客户端高速缓存的方法和系统。该方法和系统适合在现有的重定向器结构内,当离线和/或在线时以一致的方式提供对文件的访问。
虽然本发明易受各种修改或选择性结构的影响,但在附图中示出其某些例示的实施例并在上面详细地描述。不过,应该理解,没有将本发明限制在所揭示的特定形式或多个形式中的意图,但相反,目的是要覆盖落在本发明的精神和范围内的所有修改、选择性结构和等价方案。