且不可以删除块除非并直至参考计数达到零(即,当删除参考块的最后的实体的时候)。
[0171]虽然本发明不限于任意特定的用于为每个块追踪参考计数的机制,但在某些实施例中,使用位图来追踪参考计数,其中该位图具有与每个块关联的多个比特。在某些示例性实施例中,位图是现有的空闲空间位图(FSB)的修改版本,空闲空间位图(FSB)不仅被用于追踪块的状态(例如,使用的块相对空闲的块,其在原始FSB中包括每块的两个比特)也用于追踪参考计数。为方便起见,本文中这样的位图被称为“参考计数位图(ReferenceCounted Bitmap) ”或者“RCB”。例如,RCB可以包括每个编码的块的四个或者八个比特,从而体现块的状态(例如,使用的块相对空闲的块)和参考计数。下面仅是一个示例性编码方案,其使用每块八个比特,其允许去复制以及利用每块多达八个根节点来打包的根节点:
[0172]-值(value)= O:块没有被分配
[0173]-值=[1,239(OxEF)]:正常块或者快照块的参考计数
[0174]-值=[240(OxFO),247 (0xF7)]:打包的块的参考计数(参考计数I至8)
[0175]-值=248(0xF8)至 255 (OxFF):未使用的 / 保留的
[0176]可选地,可以使用独立的位图或者其它数据结构以追踪每个块的参考计数。增强的去复制
[0177]在某些示例性实施例中,当先前索引的组块不再与其原始对象关联(例如,因为与先前索引的组块关联的原始对象已经被删除或者删减)时,去复制的处理不需要被放弃。取而代之地,可以经由包含索引的组块中的块的链接的列表的文件系统来维持独立的数据结构。该数据结构可以经文件系统被保存在已知的对象中。当如以上所讨论的由去复制检测/索引引擎213检测到复制件时,则该数据结构可以被用于定位与先前索引的组块关联的块,然后其可以被检查以确定该块是否可以被用于去复制候选组块(例如,块的内容没有改变)ο如果先前索引的组块被用于去复制候选组块,则与每个块相关联的参考计数递增,并且块随后不可以被释放除非并且直至其不再被参考。
[0178]处理多层文件系统中的去复制
[0179]在某些示例性实施例中,文件系统可以是多层文件系统(MTFS),例如,在美国专利申请N0.13/043,837(2337/128)(其全部内容通过引用合并于此)中所描述的那样。MTFS可以通过将文件系统元数据放置在更快的存储器(元数据层)上来改善性能。
[0180]优选地,去复制将不允许用户对象共享用于在元数据层的文件系统元数据的块,因为如果允许,则有可能甚至在块已经停止作为部分文件系统的元数据之后,用户对象可能仍然保持元数据层中的块。
[0181]应当指出的是,对于元数据共享在用户数据层中的块一般是可接受的。
[0182]处理能复原的对象
[0183]某些示例性实施例可以支持所谓的“能复原的(resilient) ”对象,其中,能复原的对象是为其存储对象的两个完整拷贝的文件系统对象。该能复原的对象可以被去复制,虽然它们不应当以这样的方式被去复制:任意块被两个拷贝共享(这将基本上去除对象的能复原的特性)。因此,当去复制能复原的对象时,系统将确保两个拷贝不结束于指向盘上的相同的数据。
[0184]NVRAM 保留(RESERVAT1N)
[0185]在某些示例性实施例中,在去复制期间执行的修改操作将不被记录至NVRAM。这意味着在崩溃(crash)的情况下,随后的还原(rollback)将清除在最后的检查点之后在文件系统中发生的所有的去复制。
[0186]多个文件系统的去复制
[0187]可以以各种方式处理多个文件系统的去复制,诸如,例如使用用于多个文件系统的单一索引或者使用用于每个文件系统的独立的索引。某些示例性实施例将使用后一种方法。
[0188]快照恢复文件
[0189]在某些示例性实施例中,对象的快照拷贝可以通过在活动的文件系统中分配新的对象编号并且然后使得对象的节点树以及块指针与快照中的文件共享,来进行恢复。每个共享的块将需要使其参考计数递增。如果碰到处于其最大参考计数的块,则将拷贝该块,并将活动的对象更新以指向拷贝的块。该新的对象将被插入至活动的文件系统目录树,如果有需要,允许原始的以及快照恢复的对象共同存在。在根节点中可以包括标记(flag)以表明该对象已经被快照恢复。可以允许活动的对象的修改同时根据需要,递增共享的块的参考计数。用于去复制的可选组块大小
[0190]在上述的示例性实施例中,每个组块包括给定的文件系统对象的单一的块,从实施的立场来看,其为去复制提供若干简化,这通过可选实施例的下面的讨论将变得清楚,在该实施例中,每个组块包括多个块(例如,每组块四个或者八个块)。
[0191]由于对于给定量的分配的内存,去复制检测/索引引擎基本上可以索引固定的数量的组块,因此更大的组块大小允许索引更大量的数据,虽然在一些情况下更大的组块大小可能减少检测复制件的可能性(例如,匹配4K组块的数据的可能性一般可能高于匹配256K组块的数据的可能性)。
[0192]在某些具有每组块具有多个块的示例性实施例中,根据预先确定的方案将对象分至组块。例如,对象可以被连续地分至N-块的组块,例如,块1- N,块(N+l) - 2N等。
[0193]为了将这样的多个块的组块整合至上述的去复制方案中,每个组块必须被分配有检查点编号。在某些示例性实施例中,组块检查点编号是具有最高检查点编号的块的检查点编号。
[0194]另外,当去复制多个块的组块时,必须更新与候选组块相关联的对象,以使用来自先前索引的组块的相应的参考来替换在候选组块中所有的块的参考。块参考计数通常将按逐块原则(block-by-block basis)(相对于组块原则)进行处理,以便可以仅仅共享尚未达到最大参考计数的块。
[0195]可选的去复制管理
[0196]在上述的示例性实施例中,去复制被执行为后台功能,修改的组块的检测以及复制件组块的去复制都是如此。然而,发明人意识到,其它类型的去复制管理也是可能的。例如,在一个可选例中,去复制可以当修改组块是在写入路径中同步发生,从而使得,当写入到来时,由去复制检测/索引引擎哈希并处理组块,并且如果检测到复制件,则作为写入操作的一部分将其去复制。这样的同步的去复制会将等待时间(latency)引入写入路径,这可能负面地影响文件系统的性能。在另一可选例中,可以以“混合(hybrid)”同步/异步方式执行去复制,以便当写入到来时,由去复制检测/索引引擎(如同在上述的同步解决方案的那样)哈希并处理组块的同时,组块自己被写入存储器(如同在全后台去复制处理中的那样),并且如果检测到复制件,则稍后在后台将其去复制。
[0197]可选的哈希生成器的使用
[0198]在本发明的某些实施例中,基于硬件的系统220被配置使得可以由基于软件的系统和/或由基于硬件的系统调用哈希生成器222以用于附加或者代替去复制的其它基于哈希的功能,诸如,例如IPsec、SMB2签名(signing)、HCP外部迀移或者利用SHA-256哈希的其它功能。
[0199]其他方面
[0200]上面描述了去复制以及数据打包特征。这些机制应当彼此互相排他地进行考虑,即,某些实施例可能实施去复制而非数据打包,某些其它实施例可能实施数据打包而非去复制,并且还有其它实施例可能实施去复制以及数据打包两者。优选地,在示例性实施例中,实施能够被用于去复制以及数据打包两者的参考计数机制(例如,参考计数位图或者其它机制),以例如允许将来一个或者两个特性的增加。
[0201]虽然上面参考整合至基于软件的系统210的商业可用的去复制检测/索引引擎对示例性实施例进行了描述,但是应当指出的是,可以实施各种可选实施例,其中去复制检测/索引引擎作为基于软件的去复制管理器的一部分或者作为基于硬件的文件系统管理器的一部分。当去复制检测/索引引擎被实施为基于硬件的文件系统管理器的一部分时,在为候选组块生成哈希值之后,基于硬件的文件系统管理器通常将调用去复制检测/索引引擎,而不将哈希值传递至基于软件的去复制管理器。
[0202]应当指出的是,可以在图中使用箭头以表示通信、传递,或者涉及两个或者更多实体的其它活动。双端箭头一般表示活动可以在双向发生(例如,在一个方向的命令/请求以及在另一方向的对应的响应,或者由任一实体发起的点对点的通信),虽然在一些情况下,活动可以不必在双向发生。单端箭头一般表示活动专门或者主要在一个方向,虽然应当指出的是,在某些情况下,这样的方向性的活动实际可能涉及双向的活动(例如,从发送器至接收器的消息以及从接收器至发送器返回的确认,或者早于传递的连接的建立以及传递之后的连接的终止)。因此,表示具体的活动的在具体的图中使用的箭头的类型是示例性的而不应当被视为限制性的。
[0203]应当指出的是,为方便起见,上面使用了标题,不应以任意方式将其解释为限制本发明。
[0204]应当指出的是,在本文中可以使用诸如“客户端”以及“服务器”的术语以描述在本发明的某些实施例中可能使用的设备,不应当将其解释为将本发明限制至任意特定的设备类型,除非上下文另有需要。因此,设备可以包括而不限于节点、服务器、计算机、装置或者其它类型的设备。该设备通常包括一个或多个网络接口,其用于通信网络上的通信以及相应地配置为执行设备功能的处理器(例如,具有内存以及其它外设和/或特定应用硬件的微处理器)。通信网络一般可以包括公共和/或私人网络;可以包括局域、广域、城域存储和/或其它类型的网络;还可以采用通信技术,包括而不限于模拟技术、数字技术、光学技术、无线技术(例如,蓝牙)、网络技术以及互联网技术。
[0205]还应当注意的是,设备可以使用通信协议和消息(例如,由设备创建、发送、接收、存储和/或处理的消息),并且这样的消息可以由通信网络或者媒介传递。除非上下文另有需要,本发明不应当被解释为限于任意特定的通信消息类型,通信消息格式,或者通信协议。因此,通信消息一般可以包括而不限于,帧、包、数据报、用户数据报、单元、或者其它类型的通信消息。除非上下文另有需要,对特定通信协议的参考是示例性的,并且应当理解的是,可选实施例可以适当地采用该通信协议的变型(例如,随时间进行的协议的修改或者延伸)或者将来已知的或者开发的其它协议。
[0206]还应当注意的是,本文中可能对逻辑流进行了描述以说明本发明的各个方面,其不应当被解释为将本发明限定至任意特定的逻辑流或者逻辑实施。描述的逻辑可以被划分成不同的逻辑块(例如,程序、模块、功能或者子程序)而不改变总体的结果或者脱离本发明的真正保护范围。通常,可以使用不同逻辑构造(例如,逻辑门、循环元、条件逻辑以及其它逻辑构造)实施,或者以不同的顺序增加、修改、省略、执行逻辑要素,而不改变总体的结果或者脱离本发明的真正保护范围。
[0207]上述的示例性实施例包括用于处理器(例如,微处理器、微控制器、数字信号处理器或者通用目的计算机)使用的计算机程序逻辑和基于硬件的逻辑。基于硬件的逻辑可以包括用于可编程的逻辑设备(例如,现场可编程门阵列(Field Programmable GateArray, FPGA)或者其它PLD)、独立组件、集成电路(例如,特定应用集成电路(Applicat1nSpecific Integrated Circuit,ASIC)),或者包括它们的任意组合的任意其它装置来使用的可编程的逻辑。计算机程序逻辑实施一些或全部的描述的功能,通常是被实施为计算机程序指令的集合,其中,计算机程序指令被转换为计算机可执行的形式,如此存储在计算机可读介质中,并且在操作系统的控制下由微处理器执行。基于硬件的逻辑实施一些或全部的描述的功能,可以使用一个或多个适当配置的FPGA来进行实施。
[0208]计算机程序逻辑实施本文中先前的描述的所有或者部分的功能可以体现为各种形式,包括但不限于源代码形式、计算机可执行形式以及各种中间形式(例如,由汇编器、编译器、链接器或者定位器生成的形式)。源代码可以包括用于各种操作系统或者操作环境使用的以任意的各种程序语言(例如,对象代码、汇编语言或者高级语言,诸如Fortran,C,C++,JAVA,或者HTML)实施的一系列计算机程序指令。源代码可以定义并且使用各种数据结构以及通信消息。源代码可以处于计算机可执行形式(例如,经由解释器),或者源代码可以(例如,经由翻译器,汇编器,或者编译器)被转换至计算机可执行形式。
[0209]计算机程序逻辑实施所有或者部分的本文先前的描述功能可以在单一处理器上(例如,并行地)在不同时间进行执行,或者可以在多个处理器上在相同的或者不同时间进行执行,并且可以在单一操作系统进程/线程或者在不同操作系统进程/线程下运行。因此,术语“计算机处理”一般是指计算机程序指令集合的执行,而不管不同的计算机进程是否在相同的或者不同处理器上进行执行,并且不管不同的计算机进程是否运行在相同的操作系统进程/线程或者不同操作系统进程/线程下。
[0210]可以以任意形式(例如,源代码形式、计算机可执行形式或者中间形式)或永久地或暂时地在有形的存储介质诸如半导体存储器设备(例如,RAM、ROM、PROM、EEPROM、或者快闪可编程的(Flash-Programmable)RAM)、电磁存储器设备(例如,软盘或者固定的盘)、光学存储器设备(例如,CD-ROM)、PC卡(例如,PCMCIA卡)或者其它存储器设备中固定计算机程序。可以以任意形式以信号固定计算机程序,其中,所述信号使用任意的各种通信技术可发送至计算机,所述通信技术包括但不限于模拟技术、数字技术、光学技术、无线技术(例如,蓝牙)、网络技术、以及互联网技术。计算机程序可以以任意形式分发为可移动存储介质以及打印的或者电子文档(例如,压缩包装软件),用计算机系统预加载(例如,在系统ROM或者固定的盘上),或者经通信系统(例如,因特网或者万维网)从服务器或