专利名称:用于文件系统的检查点的制作方法
用于文件系统的检查点
背景技术:
在向存储器件写入数据的过程当中可能会发生停电或系统故障。当这种情况发生时,数据可能会丢失或者变得不一致。举例来说,如果在帐户持有者从ATM提取现金的过程当中发生系统故障,则所述交易可能会不公平地倾向于银行或帐户持有者。作为另一个例子,如果在涉及盘存取的长时间计算期间发生系统故障,则可能要花费很长时间来重做所述计算。这里所要求保护的主题不限于解决任何缺点或者只在例如前面所描述的环境中操作的实施例。相反,提供本背景描述只是为了说明可以在其中实践这里所描述的一些实施例的一个示例性技术领域
发明内容
简而言之,这里所描述的主题的各个方面涉及用于文件系统的检查点。在一些方面中,针对文件系统的更新被组织到检查点存储桶。当希望有检查点时,后续的更新被导向另一个检查点存储桶。在对于当前检查点存储桶中的各项更新对各个全局表进行了更新之后,创建所述全局表的逻辑拷贝。该逻辑拷贝被存储为检查点数据的一部分。为了帮助恢复,检查点管理器可以等到当前检查点存储桶的所有更新都被写入到存储装置之后才把最终检查点数据写入到存储装置。该最终检查点数据可以涉及所述全局表的逻辑拷贝,并且包括用以验证检查点数据的正确性的验证代码。提供本发明内容是为了简要地标识出将在下面的具体实施方式
部分中进一步描述的主题的一些方面。本发明内容不意图标识出所要求保护的主题的关键或必要特征,也不意图被用来限制所要求保护的主题的范围。除非上下文中明确地另有所指,否则“这里所描述的主题”这一表达法指的是在具体实施方式
部分中所描述的主题。术语“各个/ 一些方面”应被理解为“至少一个方面”。标识出在具体实施方式
部分中所描述的主题的一些方面并不意图标识出所要求保护的主题的关键或必要特征。在附图中作为举例而非限制示出了这里所描述的主题的前述各个方面和其他方面,其中相同的附图标记指代类似的元件,并且在附图中。
图I是表示可以把这里所描述的主题的各个方面合并到其中的示例性通用计算环境的方框 图2是表示这里所描述的主题的各个方面可以在其中操作的系统的组件的示例性布置的方框 图3是示出这里所描述的主题的各个方面的方框 图4是总体上表示根据这里所描述的主题的各个方面的针对文件系统的更新的图示; 图5是示出根据这里所描述的主题的各个方面的示例性检查点存储桶的方框图;以及图6-8是总体上表示根据这里所描述的主题的各个方面所可能发生的示例性动作的流程图。
具体实施例方式定义
这里所使用的术语“包括”及其变体应被理解为意味着“包括但不限于”的开放性术语。除非上下文中明确地另有所指,否则术语“或者”应被理解为“以及/或者”。术语“基于”应被理解为“至少部分地基于”。术语“一个实施例”和“一实施例”应被理解为“至少一个实施例”。术语“另一个实施例”应被理解为“至少一个其他实施例”。其他明确的和隐含的定义可以被包括在下面。示例件操作环塏
图I示出了可以在其上实施这里所描述的主题的各个方面的适当计算系统环境100的一个例子。计算系统环境100仅仅是适当计算环境的一个例子,而不意图暗示关于这里所描述的主题的各个方面的使用或功能范围的任何限制。计算环境100也不应当被解释为关于在示例性操作环境100中所示出的任何一个组件或组件组合有任何依赖性或要求。这里所描述的主题的各个方面适于与多种其他通用或专用计算系统环境或配置进行操作。适用于这里所描述的主题的各个方面的公知的计算系统、环境或配置的例子包括个人计算机、服务器计算机、手持式或膝上型器件、多处理器系统、基于微控制器的系统、机顶盒、可编程消费电子装置、网络PC、小型计算机、大型计算机、个人数字助理(PDA)、游戏器件、打印机、各种电器(包括机顶盒、媒体中心或其他电器)、嵌入或附着到汽车上的计算器件、其他移动器件、包括任何前述系统或器件的分布式计算环境等等。可以在例如由计算机执行的程序模块之类的计算机可执行指令的一般情境中描述这里所描述的主题的各个方面。一般来说,程序模块包括施行特定任务或者实施特定抽象数据类型的例程、程序、对象、组件、数据结构等等。这里所描述的主题的各个方面还可以被实践在分布式计算环境中,其中各项任务由通过通信网络链接在一起的远程处理器件施行。在分布式计算环境中,各个程序模块可以同时处在包括存储器存储器件的本地和远程计算机存储介质中。参照图1,用于实施这里所描述的主题的各个方面的示例性系统包括采取计算机110的形式的通用计算器件。计算机可以包括能够执行指令的任何电子器件。计算机110的组件可以包括处理单元120、系统存储器130以及把包括系统存储器在内的各种系统组件耦合到处理单元120的系统总线121。系统总线121可以是几种类型的总线结构当中的任一种,其中包括使用多种总线体系结构当中的任一种的存储器总线或存储器控制器、夕卜围总线以及局部总线。作为举例而非限制,这样的体系结构包括工业标准体系结构(ISA)总线、微通道体系结构(MCA)总线、增强型ISA (EISA)总线、视频电子标准协会(VESA)局部总线、外围组件互连(PCI)总线(其也被称作夹层总线)、外围组件互连扩展(PCI-E)总线、高级图形端口(AGP)以及快速PCI (PCIe)。计算机110通常包括多种计算机可读介质。计算机可读介质可以是能够由计算机110访问的任何可用介质,并且包括易失性和非易失性介质以及可移除和不可移除介质。作为举例而非限制,计算机可读介质可以包括计算机存储介质和通信介质。
计算机存储介质包括按照任何方法或技术实施的易失性和非易失性、可移除和不可移除介质,以用于存储诸如计算机可读指令、数据结构、程序模块或者其他数据之类的信息。计算机存储介质包括RAM、ROM、EEPR0M、闪存或其他存储器技术、CD-ROM、数字通用盘(DVD)或其他光盘存储装置、磁盒、磁带、磁盘存储装置或其他磁性存储器件或者可以被用来存储所期望的信息并且可由计算机110访问的任何其他媒体。通信介质通常把计算机可读指令、数据结构、程序模块或其他数据实现在调制的数据信号中,比如载波或其他传输机制,并且包括任何信息递送介质。术语“调制的数据信号”意味着信号的一项或更多项特性被以在所述信号中编码信息的方式设定或改变。作为举例而非限制,通信介质包括例如有线网络或直接连线连接之类的有线介质,以及例如声学、RF、红外和其他无线介质之类的无线介质。前述任何内容的各种组合也应当被包括在计算机可读介质的范围内。系统存储器130包括易失性和/或非易失性存储器的形式的计算机存储介质,比 如只读存储器(ROM) 131和随机存取存储器(RAM) 132。基本输入/输出系统133 (BIOS)通常被存储在ROM 131中,其包含例如在开机期间帮助在计算机110内的各个元件之间传输信息的基本例程。RAM 132通常包含可由处理单元120立即访问和/或当前正由其操作的数据和/或程序模块。作为举例而非限制,图I示出了操作系统134、应用程序135、其他程序模块136以及程序数据137。计算机110还可以包括其他可移除/不可移除、易失性/非易失性计算机存储介质。仅仅作为举例,图I示出了从不可移除的非易失性磁性介质进行读取或向其写入的硬盘驱动器141,从不可移除的非易失性磁盘152进行读取或向其写入的磁盘驱动器151,以及从可移除的非易失性光盘156 (比如CD ROM或其他光学介质)进行读取或向其写入的光盘驱动器155。可以用在所述示例性操作环境中的其他可移除/不可移除、易失性/非易失性计算机存储介质包括磁带盒、闪存卡、数字通用盘、其他光盘、数字视频带、固态RAM、固态ROM等等。硬盘驱动器141通常通过不可移除存储器接口(比如接口 140)连接到系统总线121,并且磁盘驱动器151和光盘驱动器155通常通过可移除存储器接口(比如接口 150)连接到系统总线121。前面所讨论并且在图I中示出的驱动器及其相关联的计算机存储介质对用于计算机110的计算机可读指令、数据结构、程序模块以及其他数据提供存储。在图I中,举例来说,硬盘驱动器141被图示为存储操作系统144、应用程序145、其他程序模块146以及程序数据147。注意这些组件可以是与操作系统134、应用程序135、其他程序模块136以及程序数据137相同或不同的。操作系统144、应用程序145、其他程序模块146以及程序数据147在这里被给出不同的附图标记以便说明其至少是不同的拷贝。用户可以通过输入器件向计算机110输入命令和信息,所述输入器件例如是键盘162以及通常被称作鼠标、轨迹球或触摸板的指示器件161。其他输入器件(未示出)可以包括麦克风、操纵杆、游戏手柄、碟形卫星信号收发天线、扫描仪、触敏屏、手写板等等。这些和其他输入器件常常通过耦合到系统总线的用户输入接口 160连接到处理单元120,但是也可以通过其他接口和总线结构连接,比如并行端口、游戏端口或通用串行总线(USB)。监视器191或其他类型的显示器件也通过诸如视频接口 190之类的接口连接到系统总线121。除了监视器之外,计算机还可以包括其他外围输出器件,比如扬声器197和打印机196,其可以通过输出外围接口 195连接。计算机110可以利用到一台或更多台远程计算机(比如远程计算机180)的逻辑连接而操作在联网环境中。远程计算机180可以是个人计算机、服务器、路由器、网络PC、对等器件或其他普通网络节点,并且通常包括前面关于计算机110所描述的许多或所有元件,但是在图I中仅仅示出了存储器存储器件181。图I中所描绘的逻辑连接包括局域网(LAN) 171和广域网(WAN) 173,但是也可以包括其他网络。这样的联网环境在办公室、企业范围计算机网络、内联网和因特网中是常见的。当被使用在LAN联网环境中时,计算机110通过网络接口或适配器170连接到LAN171。当被使用在WAN联网环境中时,计算机110可以包括调制解调器172或用于通过WAN173 (比如因特网)建立通信的其他装置。调制解调器172可以是内部的或外部的,其可以通过用户输入接口 160或其他适当机制连接到系统总线121。在联网环境中,关于计算机110描绘的程序模块或其各个部分可以被存储在远程存储器存储器件中。作为举例而非限制,图I将远程应用程序185图示为驻留在存储器器件181上。应当认识到,所示出的网络 连接是示例性的,并且可以使用在计算机之间建立通信链接的其他装置。检杳点处理
正如前面所提到的那样,在向存储器件写入数据的同时可能会发生停电和系统故障。这可能导致存储在存储器件上的数据处于不一致状态。为了解决这一问题和其他问题,可以向存储器件写入检查点。图2是表示这里所描述的主题的各个方面可以在其中操作的系统的组件的示例性布置的方框图。图2中示出的组件是示例性的,并且不意图全部包括可能需要或包括的所有组件。在其他实施例中,在不背离这里所描述的主题的各个方面的精神或范围的情况下,结合图2描述的组件和/或功能可以被包括在其他(所示出或未示出的)组件中或者被放置在子组件中。在一些实施例中,结合图2描述的组件和/或功能可以分布在多个器件上。翻到图2,系统205可以包括一项或更多项应用210、API 215、文件系统组件220、存储库250、通信机制255以及其他组件(未示出)。系统205可以包括一个或更多计算器件。这样的器件例如可以包括个人计算机、服务器计算机、手持式或膝上型器件、多处理器系统、基于微控制器的系统、机顶盒、可编程消费电子装置、网络PC、小型计算机、大型计算机、蜂窝电话、个人数字助理(PDA)、游戏器件、打印机、各种电器(包括机顶盒、媒体中心或其他电器)、嵌入或附着到汽车上的计算器件、其他移动器件、包括任何前述系统或器件的分布式计算环境等等。在系统205包括单个器件的情况下,可以被配置成充当系统205的示例性器件包括图I的计算机110。在系统205包括多个器件的情况下,所述多个器件当中的每一个可以包括类似地或不同地配置的图I的计算机110。文件系统组件220可以包括恢复管理器225、检查点管理器230、I/O管理器235、写入计划管理器237以及其他组件(未示出)。这里所使用的术语“组件”应当被理解成包括一个器件的全部或一部分、一个或更多软件模块或其各个部分的总集、一个或更多软件模块或其各个部分的某种组合以及一个或更多器件或其各个部分等等。通信机制255允许系统205与其他实体通信。举例来说,通信机制255可以允许系统205与远程主机上的应用进行通信。通信机制255可以是网络接口或适配器170、调制解调器172或者用于建立结合图I所描述的通信的任何其他机制。存储库250是能够提供对于数据的访问的任何存储介质。所述存储库可以包括易失性存储器(例如高速缓存)和非易失性存储器(例如永久性存储装置)。“术语”数据应当被广泛地理解成包括可以由一个或更多计算机存储元件表示的任何事物。在逻辑上,数据可以在易失性或非易失性存储器中被表示为一系列I和O。在具有非二进制存储介质的计算机中,可以根据存储介质的能力来表示数据。数据可以被组织成不同类型的数据结构,其中包括例如数字、字母等等的简单数据类型,分级、链接或其他有关数据类型,包括多个其他数据结构或简单数据类型的数据结构等等。数据的一些例子包括信息、程序代码、程序状态、程序数据、其他数据等等。存储库250可以包括硬盘存储装置、其他非易失性存储装置、例如RAM之类的易失性存储器、其他存储装置、前述各项的某种组合等等,并且可以跨多个器件分布。存储库250可以是外部的、内部的,或者同时包括处于系统205内部和外部的组件。 可以通过存储控制器240来访问存储库250。这里所使用的“访问”可以包括读取数据、写入数据、删除数据、更新数据、包括前述各项当中的两项或更多项的某种组合等等。存储控制器240可以接收针对访问存储库250的请求,并且可以适当地满足这样的请求。存储控制器240可以被布置成使其不保证将按照接收到数据的顺序将其写入到存储库250。此外,在存储控制器240把所请求的数据实际写入到存储库250的非易失性存储器之前,存储控制器240就可以表明其已经写入了所述数据。所述一项或更多项应用210包括在创建、删除或更新数据的过程中所可能涉及的任何处理。这样的处理可以在用户模式或内核模式下执行。这里所使用的术语“处理”及其变型可以包括一个或更多传统进程、线程、组件、库、施行任务的对象等等。一个处理可以用硬件、软件或者硬件与软件的组合来实施。在一个实施例中,一个处理是能够施行一项动作或者被用于施行一项动作的任何机制(不管如何称呼)。一个处理可以分布在多个器件或单个器件上。所述一项或更多项应用210可以通过API 215向I/O管理器235做出文件系统请求(例如通过函数/方法调用)。I/O管理器235可以确定将向存储控制器240 (或者某一其他中间组件)发出哪一条或哪些I/O请求。I/O管理器235还可以随着与文件系统请求相关联的操作的继续、完成或失败而向一项或更多项应用210返回数据。当文件系统请求涉及事务时,I/O管理器235可以通知事务管理器(未示出),从而事务管理器可以适当地管理事务。在一些实施例中,事务管理器的功能可以被包括在I/O管理器235中。文件系统组件220可以使用写时拷贝、原位写入、前述各项的某种组合等来把文件系统对象或者关于文件系统对象的元数据写入到存储库250。术语“文件”可以包括目录、不具有子代(其例如有时被视为文件)的文件系统对象、其他文件系统对象等等。在写时拷贝中,在修改文件的数据之前,把将被修改的数据的一份拷贝拷贝到另一个位置。在原位写入中,可以在原位修改文件的数据,而不把原始数据拷贝到另一个位置。写时拷贝和原位写入的混合可以包括针对关于文件的元数据施行写时拷贝,同时针对包括在文件中的数据施行原位写入。可以在事务的情境中更新文件系统的对象。事务是可以通过各种属性描述的一组操作,所述属性例如包括原子性、一致性、隔离性和持久性。这里所使用的“事务”可以至少由一致性属性定义,并且还可以由前面的一项或更多项其他属性定义。—致性属性指的是关于一个或更多文件所允许的数据状态。在事务开始之前或者在事务完成之后,文件系统的各个文件应当处于所允许的状态(尽管其在事务期间可以经历不被允许的状态)。举例来说,银行事务可以被实施为由两项操作构成的集合来自一个帐户的借记,以及针对另一个帐户的信贷。在该例中,一致性可以被定义为使得银行和帐户持有者的组合帐户结余是一个常数(例如T=A+B,其中T是一个常数,A=银行结余,B=帐户持有者结余)。为了在该例中实施一致性,所述借记和信贷操作只需要是针对相同的金额,并且或者是二者全部完成,或者是在每一个帐户上都没有完成。可以写入检查点以表明文件系统的一致状态。检查点可以包括一个或更多验证代码(例如一个或更多校验和、散列或其他数据),其可以被用来确定检查点和/或与检查点相关联的数据是否被正确地写入到盘上。在恢复时,可以找到最近一次写入的检查点。随后可以使用所述检查点的(多个)验证代码来确定该检查点和/或与该检查点相关联的数据是 否被正确地写入到盘上。如果不是,则可以定位前一个检查点并且检查其有效性,直到找到有效的检查点为止。一旦找到最近的有效检查点,就知道文件系统的最近的一致状态。在该点之后发生的文件系统操作可以被丢弃,或者可以按照希望施行附加的恢复动作。在一个实施例中,文件系统上的对象可以用Dn表示,其中η向系统标识该对象。文件系统上的各个对象被串行化(即能够被表示为存储库250上的数据)及解串行化。一个对象表将每一个对象标识符与其在存储库250上的位置相关联。在修改事务中第一次更新Dn时,通过利用η查找其在对象表中的位置来找到Dn。为了用在一个例子中,Dn在存储库250上的存储位置被称作U。随后从存储库250读取L1的内容,可以将所述对象解串行化(例如从串行化格式转换成所述对象的结构),并且把所述对象的将要修改的各个部分拷贝到主系统存储器中。在存储器中对所述各个部分(或其拷贝)施行更新。结合存储器中的各个部分被修改,在存储库250上为经过修改的部分指定一个或更多新位置(其被称作L2)。主系统存储器中的这些拷贝有时在这里被称作对象的“逻辑拷贝”。对象的逻辑拷贝包括可以被用来表示该对象的一个或更多数据结构。在逻辑上,逻辑拷贝是对象的复制品。在物理上,逻辑拷贝可以包括能够被用来创建对象的复制品的数据(其中包括指向其他数据的指针)。举例来说,在一种实现方式中,逻辑拷贝可以是对象的实际拷贝(例如逐比特拷贝),或者是包括可以被用来创建所述对象的数据的数据结构。在另一种实现方式中,未经修改的逻辑拷贝可以包括指向原始对象的一个或更多指针。随着所述逻辑拷贝被修改,该逻辑拷贝中的一些指针可以指向新的存储器位置(例如对于所述逻辑拷贝的已改变部分),而其他指针则可以指向原始对象的各个部分(例如对于所述逻辑拷贝的未改变部分)。利用所述指针,可以利用经过修改的数据连同原始对象的未经修改的数据一起构造经过修改的拷贝。例如可以施行创建逻辑拷贝以便减少创建对象的复制品所需的存储空间。此外,虽然在这里有时提到了串行化和解串行化,但是不意图把这里所描述的主题的各个方面限制到习惯上所考虑的串行化和解串行化。在一个实施例中,串行化版本可以与解串行化版本逐比特完全相同。在另一个实施例中,串行化版本的比特可以按照不同于解串行化版本的格式和顺序被打包。实际上,在一个实施例中,串行化和解串行化应当被理解成意味着用于存储以及从存储库取回表示对象的数据的任何机制。其他机制例如可以包括以文字格式把对象的属性写入到存储库、用标记语言把对象的属性编码在存储库中、将对象的属性和其他特征存储在存储库上的其他方式等等。在系统的意愿下(例如在事务提交之后或者某一其他时间),所述系统可以把经过修改的逻辑拷贝串行化回到稳定介质,但是这是在位置L2处实施的。把经过修改的逻辑拷贝写回到新位置的所述意图被称作写入计划。写入计划可以标识针对一个或更多对象的任意数目的更新。写入计划可以涉及发生在多于一项事务中的改变。可以把多个写入计划组合成单个写入计划。写入计划管理器237可以参与创建针对各项更新的写入计划。当写入计划涉及多个文件系统对象时(例如在一项事务的情境中),写入计划管理器237可以操作来生成表明在所述事务中所涉及的所有文件系统对象在存储装置上的位置的写入计划,以便对于文件系统保持一致状态。
当修改紧接在检查点之后发生时,可以修改被称作恢复块的一个块(其可以被复制在多个位置处),以便指向经过修改的逻辑拷贝的起始(即L2)。L2处的对象中的一个字段指向接下来将被写入的位置。该字段表示发生在检查点之间的写入计划链中的一环。结合发送针对写入逻辑拷贝的请求,可以对所述对象表做出修改。具体来说,由对象标识符索引的位置值可以被设定到将要在该处存储经过修改的逻辑拷贝的位置值(即L2)。通过这样做使得对于对象Dn的位置的后续查找将被引到位置L2,即对象的新版本。如果一项事务修改了多于一个对象,例如Di和Dp则所述对象被视为彼此“原子结合”,并且在一个写入计划中被写入。写入计划可以指明这一关系(例如以针对所涉及对象的链接的形式)。按照这种方式,可以延续任意数目的对象。还可以按照与任何其他对象相同的方式将对象表周期性地写入到存储库250。结合发送针对把对象表写入到存储库250的请求,还可以向存储控制器240发送冲刷命令。冲刷命令指示存储控制器240把来自其易失性存储器的尚未被写入的所有数据写入到存储库250的非易失性存储器。可以周期性地把检查点写入到存储装置,正如下面将更加详细地描述的那样。可以通过由存储库250存储的检查点记录来表明检查点。检查点可以在任何时间被写入,并且可以在冲刷之后变得稳定/持久。稳定/持久指的是检查点被存储在存储库的非易失性存储器上。在检查点稳定/持久之后,可以对被用于任何早前的和未被使用的对象拷贝(或其部分)的空间进行再利用。在冲刷完成之后,随后将恢复块指向接下来的写入计划链的起始。在一个实施例中,所述恢复块可以把所述写入计划链的起始指向对象表的新位置。结合图3描述一个更加具体的例子,该图是示出这里所描述的主题的各个方面的方框图。如图所示,图3示出了主存储器305和存储库250。线307代表主存储器305与存储库250之间的划分。线310上方的对象处于主存储器中,而线310下方的对象则处于存储库250的易失性或非易失性存储器中。在主存储器305中示出了对象314-316。在实施过程中,对象314-316可以分别是对象319-321的解串行化逻辑拷贝。对象319处于存储库250上的位置1550处,对象320处于存储库250上的位置200处,以及对象321处于存储库250上的位置800处。对象表310包括表明对象314-316在存储库250上的位置的关键值对。利用对象314-316的标识符(η)对各个关键值对进行索引。当事务修改对象316时(例如通过将其名称改变为foo. txt), 一致性组件(例如图2的一致性组件220)可以为更新后的对象确定新的存储位置(例如位置801)。如果所述对象是一个文件,则在事务的情境中更新其名称还可能导致包括该文件的目录也被涉及在所述事务中。举例来说,当文件名被改变时,表示该文件的对象和表示包括该文件的目录的对象可能需要被涉及在所述事务中。在这种情况下,包括所述对象的目录被表示为对象314,并且更新后的目录(例如对象318)的逻辑拷贝被表示为存储库250中的对象323。此外,表310已被逻辑地更新到表311以表明经过修改的对象(即对象317和318)的新的存储位置(即 801 和 1000)。
例如可以由I/O管理器235或图2的某一其他组件明确地表明或确定在事务的情境内修改某一对象还会影响另一个对象。当在一项事务的更新中涉及两个或更多对象时,所述对象被视为“原子结合”,正如前面所提到的那样。在恢复操作中,除非在存储库250中找到对应于在所述事务的情境中改变的所有对象的改变,否则所找到的所有改变都被丢弃。换句话说,如果找到了对应于其中一个对象的改变但是没有找到对应于另一个对象的改变,则丢弃对应于所述其中一个对象的改变。为了原子结合两个或更多对象,在一个实施例中,可以在存储库250中存储一个指针或者通过其他方式将其与每一个对象相关联。一个指针可以表明在事务中涉及到的另一个对象(或其部分)的存储位置。如果在事务中没有涉及附加的对象,则所述指针可以指向一个“死块”,或者表明另一个写入计划的“头”对象的存储位置。该头对象可以包括一个写入计划、所述写入计划的经过修改的对象(或其部分)等等。除了指向下一个存储位置的指针之外,还可以在存储库250中存储用以表明所“指向”的对象的正确内容的数据。举例来说,可以存储表明所指向的对象的正确内容的散列。在图3给出的例子中,与对象322相关联的指针可以指向与对象323相关联的存储位置。所述指针把这两个对象结合在一起。如果在恢复期间没有找到其中的一个对象或者其不具有正确的内容,则可以丢弃由所找到的对象表示的改变。由于存储库250的性质,可能无法保证哪一个对象将首先被写入到存储库250的非易失性存储器。如果对象322首先被写入并且对象323没有被写入,则来自对象322的指针将指向可能具有虚假数据的存储位置。但是通过计算所述存储位置处的数据的散列并且将该散列与对于对象322所存储的散列进行比较,可以把位置1000处的数据检测为具有无效数据。在这种情况下,在恢复期间,恢复管理器(例如图2的恢复管理器225)可以丢弃由对象322和323所表示的改变。恢复块330指向在检查点之后本应在该处存储数据的第一存储位置(在本例中是位置801)。恢复块330还可以包括利用存储在所述第一存储位置处的对象的正确内容计算的散列或者与之相关联。
图4是总体上表示根据这里所描述的主题的各个方面的发生在文件系统上的更新的图示。全局表405包括标识出各个对象在存储库上的位置的对象表以及关于存储库250上的已被分配的空间的分配数据。此外还示出了进行中的更新410。当更新接触到时间轴415时,所述更新完成,并且不再需要修改全局表405的任何内容。更新410的每一条更新线可以表示多项更新。如果需要一起做出多项更新以便保持一致性,则可以在事务的情境中做出所述更新。为了使得检查点有效,需要在一致状态下写入所述检查点。对于写时拷贝文件系统,当更新某一对象时,所修改的对象的逻辑拷贝被存储在文件系统的一个新位置处。该新位置在对象表中由对于对象表的更新反映出来。为了一致性,对象表反映出尚未被写入到盘上的更新将是错误的,这是因为在系统故障之前所述更新可能没有完全被写入到盘上。类似地,如果更新完成并被写入到盘上并且其他事务相关的更新也被完成但是对象表没有表现出所述更新,则这也将是错误的。为了确保一致性,需要在全局表中反映出对应于更新的元数据时选择检查点。如 果表示更新410的每一条线表明可以针对所述更新对全局表405做出更新的一个周期,则在时间520施行检查点可能产生不一致状态,而在时间525施行检查点则将产生一致状态。图5是示出根据这里所描述的主题的各个方面的示例性检查点存储桶的方框图。为了解决前面提到的问题和其他问题,每一项更新可以与一个检查点存储桶(例如其中一个存储桶515)相关联。检查点存储桶是表明在把检查点的检查点数据写入到盘上之前需要更新全局表以便至少考虑到与所述检查点存储桶相关联的更新的写入计划的逻辑概念。换句话说,需要更新全局表以便考虑到存储桶的各项更新的位置和分配信息,尽管所述更新当前可能或者可能没有被写入到这些位置。可以周期性地(例如在基于恢复窗口的检查点定时器到期时、在发生了一定次数的写入之后、在超出了某一其他阈值之后等等)做出生成检查点的决定。当这种情况发生时,检查点管理器可以更新表明检查点存储桶与后续更新相关联的数据(例如数据结构510 )。举例来说,检查点管理器可以获得表明当前检查点存储桶的数据(例如数据结构510 )上的互斥锁定(例如锁定505)。在检查点管理器获得了所述数据上的互斥锁定之后,检查点管理器可以更新所述数据以表明对应于后续更新的新的检查点存储桶。所有后续更新都与所述新的检查点存储桶相关联,直到所述数据被改变以表明对应于后续更新的另一个检查点存储桶为止。检查点存储桶可以被视为一种逻辑概念,并且可以通过多种方式来实施。举例来说,在一种实现方式中,检查点存储桶可以被实施为诸如列表之类的数据结构,所述列表具有指向与检查点存储桶相关联的每一项更新的指针。作为另一个例子,检查点存储桶可以被实施为针对每一项更新保持的数据,其中所述数据表明与所述更新相关联的检查点。作为另一个例子,检查点存储桶可以被实施为计数信号量。在该例中,可能不知道哪些更新仍需要被写入到盘上,但是知道仍需要被写入到盘上的更新的计数。在该例中可以使用读取/写入锁定。前面的例子不意图包含或穷举实施检查点存储桶的所有方式。实际上,基于这里的教导,本领域技术人员可以认识到用于实施检查点存储桶的许多其他机制。在表明对应于后续更新的检查点存储桶(例如通过改变数据结构510)之后,检查点管理器可以等待生成对应于当前检查点存储桶中的所有更新的写入计划。在生成了对应于当前检查点存储桶中的所有更新的写入计划之后(但是可能未将其写入到存储装置),检查点管理器可以取得图4的全局表405的快照,并且创建针对把全局表405的快照写入到存储库的写入计划。可以通过写时拷贝或其他机制将快照创建为全局表405的一份逻辑拷贝。回到图4,可以生成对应于检查点之后的更新的写入计划并且将其写入到盘上,同时检查点管理器等待生成当前检查点存储桶中的所有更新,并且同时检查点管理器还生成针对写入检查点的写入计划。但是当检查点管理器尝试获得全局表的快照时,检查点管理器可以在创建所述快照之前获得全局表405上的互斥锁定。在检查点管理器具有互斥锁定的同时,仍然可以对于其他更新生成写入计划并且甚至可以将这些写入计划存储在存储库上,但是直到检查点管理器释放其互斥锁定之后,全局表(例如对象表)才可以被更新以便指向这些写入计划。结合释放所述锁定,检查点管理器可以发送一个信号(例如引发某一事件),其表明后续检查点已被启用并且后续的更新可以对全局表进行更新。为了帮助恢复,可以将检查点与验证代码一起写入到盘上以便根据下面的规则验 证所述检查点
1、等待由写入计划表明的数据被写入到盘上(例如等待与检查点相关联的所有更新被写入到盘上);
2、请求把与检查点相关联的所有数据写入到盘上(例如请求把元数据的逻辑拷贝写入到盘上);
3、发起或等待冲刷并且等待表明冲刷已成功完成的确认。4、生成对应于已被写入到盘上的检查点的验证代码。在一个实施例中,所述验证代码可以对应于已被写入到盘上的数据的一个子集。举例来说,如果对应于文件的数据被存储在树中,其中所述树的每一个节点包括对应于其子代的验证代码,则所述验证代码可以是对应于树的根节点。在该实施例中,验证代码可以与根节点一起写入,并且还可以被用来验证所述验证代码是正确的。5、请求把验证代码(以及比如根节点之类的任何相关联的数据)写入到盘上。注意在系统发生故障之前,验证代码可能没有实际上到达盘上。如果没有的话,则所述检查点不是有效检查点。有了这些规则,在恢复期间,如果在存储装置上找到检查点并且检查点的内部验证代码是有效的,则与检查点相关联的其他数据也预期会被存储在所述存储装置上并且是有效的。如果验证代码被包括在根节点中,则根节点中的其他数据(例如指向树中的其他节点的指针)可以被用来找到对应于检查点的其余数据。作为一种替换方案,对应于与检查点相关联的每一项更新的验证代码可以被写入到存储装置。举例来说,检查点可以表明本应在该检查点之前并且在前一个检查点之后发生的所有更新的各个块。对于所表明的每一个块,检查点可以存储表明该块的正确内容的验证代码。在这种替换方案中的恢复期间,为了验证检查点,可以将每一个块关于其检查点的相关联的验证代码进行验证。回到图2,在一个实施例中,检查点管理器230可以操作来施行包括以下各项动作I、确定将与针对更新文件系统对象的请求相关联的第一检查点。如前所述,检查点管理器230可以通过更新某一数据结构(例如图5的数据结构510)以便指向新的检查点存储桶来实现这一点。随后随着接收到针对更新的每一则后续请求,可以把该请求指派到该新的检查点存储桶。注意这里所使用的术语“第一”并不意味着实际的第一个检查点;相反其被用来与“第二”检查点进行区分。换句话说,如果存在N个检查点,则第一检查点可以是其中1<=X<=N的任意X,并且第二检查点可以是其中1〈=Y〈=N并且XOY的任意Y。2、确定何时把与检查点相关联的检查点数据写入到文件系统的存储装置。举例来说,可以是检查点定时器到期、可以是更新数据被超过,或者某一其他阈值可以用来确定到了写入检查点数据的时间。3、对于针对更新文件系统对象的后续请求确定第二检查点。如前所述,检查点管理器230可以通过在数据结构(例如图5的数据结构510)上获得互斥锁定(例如锁定505)之后更新所述数据结构来实现这一点。 4、等待文件系统的一致状态并且同时允许准备对于后续请求写入数据。当与当前检查点存储桶相关联的所有更新被表示在(例如已被成功地写入到)存储装置上时,一致状态发生。允许准备对于后续请求写入数据包括允许对于后续请求生成写入计划并且写入到存储装置,但是直到创建了元数据(例如全局表)的逻辑拷贝之后才允许更新所述元数据。5、创建文件系统的元数据的逻辑拷贝。这一点可以通过如前所述地取得全局表的快照来实现。6、把元数据的逻辑拷贝写入到存储装置。在一个实施例中,这方面可以包括请求把逻辑拷贝写入到存储装置并且等待关于所述逻辑拷贝已被写入到存储装置的证实。在另一个实施例中,这方面可以包括在允许对于元数据的后续更新之前将存储装置上的所述拷贝标记为清洁,从而使得所述更新导致写时拷贝。7、将至少一项验证代码写入到存储装置。如前所述,可以使用验证代码来确定检查点之前的更新是否被写入到存储装置以及检查点记录本身是否有效。API 215可以接收针对修改在一项事务中涉及的对象的请求。作为响应,I/O管理器235可以在存储库的某一存储位置(例如L1)处定位所述对象,创建所述对象的逻辑拷贝,在事务的情境中对所述对象做出改变,确定用于存储经过改变的逻辑拷贝的第二存储位置(例如L2),向存储控制器240发送针对写入经过改变的逻辑拷贝的请求,以及更新易失性数据结构(例如对象表310)以表明逻辑拷贝被存储在第二存储位置处。如果API 215接收到针对在所述事务中涉及的另一个对象的请求,则I/O管理器235可以施行附加的动作,其中包括创建将所述其他对象与第一对象结合在一起的关联(例如写入计划)。随后,结合发送针对把各个对象的修改写入到存储装置的请求,I/O管理器235还可以向存储控制器240发送针对把所述关联写入到存储装置的请求。图6-8是总体上表示根据这里所描述的主题的各个方面所可能发生的示例性动作的流程图。为了解释起来简单,结合图6-8描述的方法被描绘并且描述为一系列步骤。应当理解并且认识到的是,这里所描述的主题的各个方面不限于所示出的步骤和/或各个步骤的顺序。在一个实施例中,各个步骤按照下面所描述的顺序发生。但是在其他实施例中,各个步骤可以并行地发生、按照另一顺序发生以及/或者与未在这里给出并描述的其他步骤一起发生。此外,可能并不需要所示出的所有步骤来实施根据这里所描述的主题的各个方面的方法。此外本领域技术人员还将理解并且认识到,所述方法可以替换地通过状态图被表示为一系列互相关的状态或者被表示为事件。翻到图6,在方框605中,所述动作开始。在方框610中,做出表明将把第一更新集合与第一检查点相关联的指示。这方面可以通过修改某一数据结构以表明将把后续更新与第一检查点相关联来实现。这方面例如可以涉及获得并且释放锁定以及更新指针或其他数据结构以便指向某一检查点存储桶,正如前面所提到的那样。再次注意,“第一”可以意味着文件系统的任意检查点,并且被用来把该检查点与后续检查点进行区分。举例来说,参照图2和5,检查点管理器230可以获得数据结构510上的锁定505,并且更新所述指针以便指向其中一个检查点存储桶515。在方框615中,接收更新并且将其与第一检查点相关联。举例来说,参照图2,1/0管理器235可以通过API 215从(多个)应用210接收更新请求。在接收到更新时,可以将其与检查点相关联。
在方框620中,确定将第一检查点的检查点数据写入到文件系统的存储装置。举例来说,参照图2,检查点管理器230可以确定检查点定时器已到期,并且可以由此确定将把检查点写入到存储库250。在方框625中,在用于表明对应于后续更新的检查点的数据结构上获得锁定。举例来说,参照图2和5,检查点管理器230可以获得数据结构510上的锁定505。在方框630中,更新所述数据结构以便指向另一个检查点。修改该数据结构表明将把在第一更新集合之后发生的任何更新与后续检查点相关联。举例来说,参照图2和5,检查点管理器230可以更新数据结构510以便指向另一个检查点存储桶515。在方框635中,释放所述锁定。举例来说,参照图2和5,检查点管理器230可以释放锁定505。在方框640中,生成对应于所述更新的写入计划。每一个写入计划对于表示第一更新集合当中的至少一项更新的数据表明存储装置上的至少一个计划位置。举例来说,参照图2,写入计划管理器237可以参与创建针对与某一检查点相关联的更新的写入计划。在方框645中,对于所述写入计划更新元数据。该元数据表明对应于各个写入计划的存储位置(尽管所述写入计划可能已被或者可能尚未被写入到存储装置)。举例来说,参照图2,写入计划管理器237可以更新全局表以便表明由所述写入计划修改的存储位置对象。在方框645之后,所述动作在图7的方框705中继续。翻到图7,在方框705中,对于所述元数据获得锁定。举例来说,参照图2和4,检查点管理器230可以在全局表405上获得锁定。检查点管理器230可以等到元数据反映出对应于第一更新集合当中的所有更新的存储位置为止(尽管所有这些更新可能已被或者可能尚未被写入到这些存储位置)。在方框710中,创建元数据的逻辑拷贝。如前所述,这方面可以涉及创建元数据的新拷贝,将元数据标记为清洁从而使得对于所述元数据的后续更新导致写时拷贝,或者某种其他逻辑拷贝机制。举例来说,参照图2和4,检查点管理器230可以制作全局表405的逻辑拷贝。在方框715中,释放所述锁定。举例来说,参照图2和4,检查点管理器230可以释放全局表405上的锁定。在方框720中,创建针对写入第一检查点数据的写入计划。创建该写入计划可以与对于所述检查点之后的更新生成写入计划(并且将其写入到盘上)以及把对应于当前写入计划的数据写入到盘上并行地发生。举例来说,参照图2,检查点管理器230可以使用写入计划管理器237来创建针对第一检查点的检查点数据的写入计划。该数据可以包括全局表的逻辑拷贝,正如前面所提到的那样。·在方框725中,在一个实施例中,检查点管理器可以等到第一更新集合的所有更新都被成功地写入到存储装置为止。在所有更新都被成功地写入到存储装置之后,更新管理器随后可以写入包括验证代码的最终检查点记录。正如前面所提到的那样,这样允许恢复处理简单地检查所述验证代码以便确定是否对应于所述检查点的所有更新都预期已被写入到存储装置。在另一个实施例中,检查点管理器可以在一条检查点记录中写入几项验证代码。这些验证代码可以与第一更新集合当中的各项更新的存储位置相关联。在该实施例中,检查点管理器可以等到这些更新被写入到存储装置,或者可以在不做等待的情况下写入检查点记录。如果选择了后一选项,则与验证有效检查点记录处于盘上相比,在恢复期间可能更多地涉及找到适当的检查点。在方框730中,可以把检查点数据写入到存储装置。这方面例如可以涉及把与检查点数据相关联的写入计划写入到存储装置。作为另一个例子,这方面可以涉及把涉及各个全局表的逻辑拷贝的检查点记录写入到存储装置。举例来说,参照图2,检查点管理器230可以请求把对应于检查点数据的写入计划写入到存储装置。在方框735中,将至少一项验证代码写入到存储装置。可以将把至少一项验证代码写入到存储装置的措施与把涉及各个全局表的逻辑拷贝的检查点记录写入到存储装置的措施相组合。举例来说,参照图2,检查点管理器230可以把检查点记录写入到存储装置,所述检查点记录涉及各个全局表的逻辑拷贝并且包括用于验证所述检查点记录的内容的验证代码。在方框740中,可以施行其他动作(如果有的话)。翻到图8,在方框805中,所述动作开始。在方框810中,接收恢复请求。举例来说,参照图2,恢复管理器225可以接收针对对于存储在存储库250上的数据施行恢复的恢复请求。在方框815中,定位检查点数据。举例来说,参照图2,恢复管理器225可以定位存储在存储库250 (或某一其他存储库)上的最近的检查点数据。在方框820中,利用验证代码对所述检查点数据进行验证。举例来说,参照图2,恢复管理器225可以计算检查点数据的校验和,并且把该校验和与和检查点数据一起存储的校验和进行比较。如果两个校验和匹配,则可以认为检查点是有效的。如果希望进行额外的验证,则恢复管理器可以尝试验证由检查点数据所涉及的各个全局表所表明的一个或更多对象。在方框825中,可以施行其他动作(如果有的话)。从前面的具体实施方式
可以看到,前面描述了涉及用于文件系统的检查点的各个方面。虽然这里所描述的主题的各个方面可以有各种修改和替换构造,但是在附图中示出并且在前面具体实施方式
了其特定所示实施例。但是应当理解的是,所要求保护的主题的各个方面不意图被限制到所公开的具体形式,相反,这里的意图是涵盖落在这里所描述的主题的各个方面的精神和范围内的所有修改、替换构造和等同方案。
权利要求
1.一种至少部分地由计算机实施的方法,所述方法包括 表明将把第一更新集合与第一检查点相关联; 确定把关于第一检查点的检查点数据写入到文件系统的存储装置,所述文件系统使用写时拷贝来更新文件系统的数据; 表明将把在第一更新集合之后发生的任何更新与后续检查点相关联; 生成针对第一更新集合的写入计划,每一个写入计划表明对应于表示第一更新集合当中的至少一项更新的数据的存储装置上的至少一个计划位置; 更新元数据以便表明文件系统的分配数据以及对应于由所述写入计划修改的文件系统对象的存储位置;以及创建元数据的逻辑拷贝。
2.权利要求I的方法,其还包括 创建针对写入第一检查点数据的写入计划,同时允许与创建所述写入计划并行地生成对应于后续更新的写入计划;以及 把至少一项验证代码写入到存储装置,所述至少一项验证代码是检查点数据的一部分,所述至少一项验证代码可用来确定第一更新集合是否被正确地写入到存储装置。
3.权利要求2的方法,其还包括在把所述至少一项验证代码写入到存储装置之前,等待表示第一更新集合的数据被写入到存储装置。
4.权利要求2的方法,其中,把至少一项验证代码写入到存储装置包括与涉及表示所述元数据的逻辑拷贝的至少一个树状数据结构的根节点的其他数据一起在一个块中把单项验证代码写入到存储装置,并且还包括计算所述单项验证代码以便验证所述块。
5.权利要求2的方法,其还包括读取所述至少一项验证代码,从存储装置上的数据计算至少一项其他验证代码,把所述至少一项验证代码与所述至少一项其他验证代码进行比较,以及由此确定表示第一更新集合的所有数据是否已被成功写入到存储装置。
6.权利要求I的方法,其中,表明将把第一更新集合与第一检查点相关联包括更新一个数据结构,其表明对于在所述数据结构被更新为表明另一个检查点之前所发生的任何更新将使用第一检查点。
7.权利要求I的方法,其中,创建元数据的逻辑拷贝包括与把表示第一更新集合当中的至少一项更新的数据写入到存储装置并行地创建所述逻辑拷贝。
8.计算环境中的一种系统,其包括 可操作来接收针对更新文件系统的文件系统对象的请求的接口 ; 可操作来确定将要发送到存储库以满足所述请求的一项或更多项I/o请求的I/O管理器;以及 可操作来施行包括以下动作的检查点管理器确定将与针对更新文件系统对象的请求相关联的第一检查点,其中所述检查点管理器能够将各项请求指派给不同的检查点;确定将把与所述检查点相关联的检查点数据写入到文件系统的存储装置;确定对应于针对更新文件系统对象的后续请求的第二检查点;等待文件系统的一致状态并且同时允许准备针对后续请求写入数据;创建文件系统的元数据的逻辑拷贝;把所述逻辑拷贝写入到存储装置;以及把至少一项验证代码写入到存储装置,所述至少一项验证代码可用来确定所述检查点之前的更新是否已被写入到存储装置。
9.权利要求8的系统,其中,所述检查点管理器可操作来确定将与针对更新文件系统对象的请求相关联的检查点包括所述检查点管理器可操作来更新一个数据结构,其表明对于在确定把与第一检查点相关联的检查点数据写入到文件系统的存储装置之前所发生的更新将使用该检查点,并且对于此后发生的更新将使用第二检查点。
10.权利要求8的系统,其中,所述检查点管理器可操作来确定把与检查点相关联的检查点数据写入到文件系统的存储装置包括所述检查点管理器可操作来确定检查点定时器已到期,所述检查点定时器是基于恢复窗口。
11.权利要求8的系统,其还包括可操作来生成写入计划的写入计划管理器,所述写入计划表明将与文件系统对象相结合地更新以便保持文件系统的一致状态的所有文件系统对象在所述存储装置上的位置。
12.权利要求8的系统,其中,所述检查点管理器可操作来等待文件系统的一致状态包括所述检查点管理器可操作来等到与第一检查点文件系统对象相关联的所有更新都被表示在文件系统的存储装置上为止。
13.权利要求8的系统,其中,所述检查点管理器可操作来允许准备针对后续请求写入数据包括所述检查点管理器可操作来允许针对后续请求生成写入计划并且将其写入到存储装置,但是直到创建了元数据的逻辑拷贝之后才允许更新所述元数据。
14.一种具有计算机可执行指令的计算机存储媒体,所述计算机可执行指令在被执行时施行包括以下动作 接收针对文件系统的恢复请求; 在文件系统的存储装置上定位检查点的检查点数据,所述检查点数据是先前通过包括以下动作而生成的表明将把在与所述检查点相关联的各项更新之后发生的任何更新指派给后续检查点;针对与所述检查点相关联的各项更新生成写入计划,每一个写入计划表明用于表示至少其中一项所述更新的存储装置上的至少一个计划位置;更新元数据以便表明由所述写入计划修改的对象的存储位置;创建元数据的逻辑拷贝;以及关于所述检查点把至少一项验证代码写入到存储装置;以及 利用所述验证代码验证所述检查点数据。
15.权利要求14的计算机存储媒体,其中,利用所述验证代码验证所述检查点数据包括计算所述检查点数据的校验和,并且把所述检查点数据的校验和与所述验证代码进行比较。
全文摘要
这里所描述的主题的各个方面涉及用于文件系统的检查点。在一些方面中,针对文件系统的更新被组织成检查点存储桶。当希望有检查点时,后续的更新被导向另一个检查点存储桶。在针对当前检查点存储桶中的各项更新对各个全局表进行了更新之后,创建所述全局表的逻辑拷贝。该逻辑拷贝被存储为检查点数据的一部分。为了帮助恢复,检查点管理器可以等到当前检查点存储桶的所有更新都被写入到存储装置之后才把最终检查点数据写入到存储装置。该最终检查点数据可以涉及所述全局表的逻辑拷贝,并且包括用以验证检查点数据的正确性的验证代码。
文档编号G06F17/30GK102934114SQ201180029522
公开日2013年2月13日 申请日期2011年6月1日 优先权日2010年6月15日
发明者J.M.卡吉尔, T.J.米勒, W.R.蒂普顿 申请人:微软公司