具体实施方式
在以下描述中,为了说明的目的,阐述了许多具体的细节以提供对本发明的整体的理解。然而,将显而易见的是可以在没有这些具体细节的情况下实践本发明。在其他实例中,以框图的形式示出了众所周知的结构和设备以避免不必要地使本发明模糊不清。
总体概览
提供了一种用于维护并使用内容可寻址存储系统中的子对父映射的缓存的技术。子对父映射的缓存被维护用于属于文件系统层级的块。该文件系统层级包括表示文件系统卷的文件夹和文件的对象块。该块被存储在内容可寻址存储系统中。各个子对父映射将特定块映射至块的层级的父块。该子对父映射允许在没有从文件系统层级的根块遍历该文件系统层级的前提下快速地确定任意特定块的路径。
当文件系统层级被修改时,生成新的根块。更新子对父映射的缓存是通过:基于从新的根块遍历当前文件系统层级的至少一部分来添加一个或多个第一子对父映射以及基于从先前根块遍历先前文件系统层级的至少一部分来移除一个或多个第二子对父映射。表示文件系统层级的图表被频繁地修改。通常,每次修改包括对大的图表进行的改变的小集合。本文中描述的技术在与对文件系统层级进行改变的次数成正比的时间量(而非与表示文件系统层级的图表的大小成正比的时间量)产生对于表示文件系统层级的图表的改变,使得更新处理是可升级的。
更新处理能够产生所添加的块的列表和所移除的块的列表、或者以其他方式识别先前文件系统层级与随后的当前文件系统层级之间的差异。所添加的块和所移除的块的列表可以被用于执行一个或多个文件系统维护功能。在一个实施方式中,基于所添加的块和所移除的块有效地更新了与文件系统卷相关的块数据的索引。
块存储服务器
图1是图示了一系统的实施方式的框图,该系统用于表示内容可寻址存储系统中的文件系统卷的。块数据存储器114是被配置为存储多个块的内容可寻址存储系统。尽管示出了单个块,但是,块数据存储器114可以包括任意数量的块数据存储器、网络部件或适合于实施数据存储系统的任何其他部件。在一个实施方式中,块数据存储器114和块存储服务器112是云存储服务器的部件。
块存储服务器112提供经由基于块内容的访问密钥(诸如块的内容的哈希值)对存储在块数据存储器114中的块的访问。可以被用于生成访问密钥的哈希函数的实例包括但不限于MD5、SHA-1和SHA-2。虽然详细描述的实施方式使用哈希值作为访问密钥,但可以使用任何其它基于内容的访问密钥用于维护并使用可内容寻址存储系统中的子对父映射的缓存。
文件系统客户端102至106被配置为存储和访问被存储作为块数据存储器114中的块的一个或多个文件系统卷中的文件。文件系统客户端102至106可以与利用文件系统的应用程序、系统、服务或任何其他类型的实体相对应。块数据存储器114可以存储属于用于一个或多个文件系统客户端102至106的不同的文件系统卷的块。此外,文件系统客户端102至106中的每一个可以访问的一个或多个文件系统卷,并且各个文件系统卷可以由一个或多个文件系统客户端102至106访问。
在一个实施方式中,文件系统客户端106包括文件夹与文档层(folders anddocuments layer)108以及块系统客户端110。文件系统客户端106可以通过文件夹与文档层108访问由块数据存储器114所存储的一个或多个文件系统卷。在一个实施方式中,文件夹与文档层108允许文件系统客户端106的应用程序和用户以与传统的文件系统相类似的方式来访问远程存储的文件系统卷。例如,文件夹与文档层108可以将存储在块数据存储器114中的文件系统卷呈现为传统的层级化文件系统中的文件夹与文档的集合。
文件夹与文档层108与块系统客户端110通信以经由块存储服务器112访问块数据存储器114。块系统客户端110被配置为与块存储服务器112通信以访问由块数据存储器114所存储的块数据。在一个实施方式中,块系统客户端110被配置为通过一个或多个网络与块存储服务器112进行通信。在一个实施方式中,块系统客户端110进一步被配置为基于从块存储服务器112中检索到的块来构造文件系统卷的目录结构。
作为块的层级的文件系统
块可以被用于表示文件系统卷的文件系统层级。在一个实施方式中,内容可寻址存储系统是不可变的(immutable)。一旦数据的块与访问密钥(诸如块的哈希值)相关地存储,不能直接在访问密钥的位置处修改数据的块。相反,创建了新版本的块,并且将新的版本与块的原始副本分开存储。此外,数据被存储为将新的块的位置与新的访问密钥相关联,其中,新的访问密钥基于修改后的块的内容。为了表示文件系统卷的目录结构(它通常是可变的),故需要将这些访问密钥改变考虑在内。
图2是图示了在文件系统卷被修改之前和之后的块的层级的实施方式的框图。结构化块202至256包括目录对象块202至208和252至256,以及文件对象块210至218和250。目录对象块表示文件系统卷的目录,而文件对象块表示文件。如本文中所使用的,术语“结构化块”指代包含对于另一个对象块的访问密钥的块。在一个实施方式中,利用访问密钥将层级化文件系统关系存储在结构化块中。在一个实施方式中,与结构化块相关联的数据和/或元数据被存储作为内容可寻址存储系统中的一个或多个单独的块。在一个实施方式中,文件对象块210至218和250包括对于包含文件元数据和/或文件数据的一个或多个块的访问密钥,并且目录对象块202至208和252至256包括对于包含目录元数据和/或目录内容数据的一个或多个块的访问密钥。在于2013年11月21日提交的题为“REPRESENTING DIRECTORYSTRUCTURE IN CONTENT-ADDRESSABLE STORAGE SYSTEMS”的美国专利申请第14/086,197号中进一步详细地描述了利用结构化块来实施文件系统结构,通过引用将其阐述的全部内容结合于本文中。
尽管在文件系统层级200中的对象块的布置反映了与对象块相对应的目录与文件之间的层级化关系,但块存储器内的对象块的实际布置可能与层级无关。例如,对象块可以被分布在多个存储设备上,诸如在云存储系统中。
文件系统层级240表示在文件系统卷修改之前的文件系统卷内的目录结构。如本文中所使用的,术语“层级”包括但不限于树。在一个实施方式中,文件系统层级240是任何有向无环图(directed acyclic graph)(DAG)。任何给定的对象块或对象块的子层级可能属于全局层级200内的多个文件系统层级。例如,第一文件系统层级240与第二文件系统层级242共享一个或多个块,其中,第一文件系统层级240与第二文件系统层级242与不同的时间点(即,所示出的文件系统修改之前和之后)的同一文件系统卷相对应。任何给定的对象块或对象块的子树还可能属于用于不同的文件系统卷的文件系统层级。同一对象块还可以属于文件系统卷内的多个文件夹。例如,文件系统层级240包括文件对象块218,其代表属于文件夹“文档(DOCS)”与“照片(PHOTOS)”两者的文件“文本文件(TEXT FILE)”。全局层级200可以表示用于同一内容可寻址存储系统中的多个文件系统卷的所存储的块。然而,与文件系统卷相对应的子对父映射的缓存将仅包括用于特定文件系统卷的子对父映射。
以反映存储在文件系统层级240中的对象之间的层级化关系的方式布置对象块202至218。如通过文件系统层级240所指示的,文件“文件1(FILE 1)”至“文件N(FILE N)”(与对象块212至216相对应)驻留在目录“演示文件(PPTS)”(与目录对象块208相对应)。目录“演示文件(PPTS)”是目录“文档(DOCS)”(与对象块204相对应)的子(child)、其依次是目录“杰克(JACK)”(与目录对象块202相对应)的子、其是文件系统层级240的根目录。对象块202是特定文件系统卷的文件系统层级240的根对象块。利用根对象块202的访问密钥可访问整个文件系统卷以遍历文件系统层级240。子树230包括针对“文件夹X(FOLDER X)”的内容的对象块,其由目录对象块216表示。
文件系统卷修改
此外,当使用块(chunk)存储实现文件系统层级时,单个文件的修改或移除可能使得相应对象块以及其在文件系统层级中的每个前体对象块(ancestor object chunk)的改变成为必然。具体地,因为通过基于内容来寻址的对象块实现文件,所以单个文件的修改使得在文件系统层级中在该文件上方的每个目录创建新的目录对象块,原因在于在前提目录对象块中操作的相应访问密钥也必须更新。文件系统层级242表示在所述的文件系统卷修改之后的同一文件系统卷内的目录结构。
例如,假设文件系统卷的授权用户修改“文件1”(对应于对象块212)。因为对“文件1”的修改改变对象块的内容,并且在内容可寻址的存储系统中基于内容来寻址块,所以所修改的数据并不是简单地存储在对象块212(对应于“文件1”的先前版本)上。而是,产生对应于“文件1”的修改版本的新的对象块250并且其存储在内容可寻址的存储系统中。新的对象块250与对象块212单独地存储。
因为“文件1”的当前版本对应于新的对象块250,所以目录对象块208(对应于父目录“PPTS”)也必须更新为指向“文件1”的当前版本的新对象块254。为了在文件系统卷中更新目录“PPTS”,产生新的目录对象块252并且存储其。新的目录对象块252(对应于目录“PPTS”的更新版本)指向对象块254(对应于“文件1”的更新版本)而不指向对象块212(对应于“文件1”的先前版本)。同样地,原始的目录对象块204(对应于目录“DOCS”)也必须更新为指向“PPTS”目录的新的块。为了更新目录“DOCS”,产生新的目录对象块254并且存储为用于目录“DOCS”。因为类似的原因,新的目录对象块256存储为用于根目录“JACK”(其为“DOCS”的父)。在修改“文件1”之后,使用新的目录对象块256来访问整个文件系统卷。
因为目录对象块206、210和216不是修改的对象块212的前体,所以在文件系统层级242中不需要修改这些目录对象块。此外,对于目录对象块216的子树230中的任何子块,修改是不必要的。
作为修改“文件1”的结果,几个块已“过期(stale)”。过期的块是其数据不再反映文件系统卷的当前状态的块。在以上给出的实例中,对“文件1”的更新使对象块212、208、204和202变过期。执行更多的更新,更多的块过期。
子至父映射
子至父映射的缓存(cache)包括一个或多个子至父映射。子至父映射对应于文件系统层级中的特定子块。文件系统层级240表示存储在内容可寻址的存储系统中的文件系统卷的目录结构。子至父映射在文件系统层级240中将特定的块映射至父块。块可具有多于一个的父,所以多个子至父映射可对应于特定块。图3A至图3C是描绘子至父映射的缓存的实施方式的方框图。
图3A是描绘与文件系统卷修改之前的图2的文件系统卷对应的子至父映射的缓存的实施方式的方框图。在“文件1”的修改之前,文件系统卷的根块是对象块202。缓存300包括对应于文件系统层级240的多个子至父映射,其从根块202开始。对于文件系统层级240中的每个子对象块,缓存300包括将子块映射至其(多个)父块的一个或多个子至父映射。
因为对象块218具有两个父对象块200和对象块206,所以为对象块218存储两个子至父映射。当子块具有多个父块时,多个子至父映射可存储为从子块至父块组的多个映射结构。然而,即使存储多个映射结构,多个映射结构表示多个潜在的子至父映射。
在一个实施方式中,使用相应块的访问密钥将子块映射至父块。例如,如果块的访问密钥是块的哈希值,即,H(块),则子至父映射将H(子块)映射至H(父块)。为了简便起见,每个块的标签(如图2所示)用于表示在缓存300和下文中示出的子至父映射的缓存的其他实施方式中的访问密钥。
图3B是描绘与文件系统卷修改之后的图2的文件系统卷相对应的子至父映射的缓存的实施方式的方框图。在“文件1”的修改之后,文件系统卷的根块是对象块256。缓存310包括对应于文件系统层级242的多个子至父映射,其从文件系统卷的当前根块(即,对象块256)开始。对于文件系统层级242中的每个子对象块,缓存310包括将子块映射至其(多个)父块的一个或多个子至父映射。
在一个实施方式中,可通过从文件系统卷的根块遍历文件系统层级来产生子至父映射的缓存。可替代地和/或此外,可在一个或多个文件系统卷修改之后通过更新缓存来维持子至父映射的缓存。子至父映射的缓存的版本可在内容可寻址的存储系统中永久地存储为一个或多个映射块。下面更详细地描述更新子至父映射的缓存的过程。本文中描述的过程将适当地为块级别改变(例如,添加、删除和修改)、层级级别改变(例如,向层级上方或下方移动根块)以及卷级别改变(例如,从空文件系统卷移动至填充的文件系统卷,反之亦然)更新缓存。在图3A至图3B中,从缓存300和缓存310中省略由图2的子树230表示的块。
缓存300对应于文件系统层级240,其通过其根块202可识别。缓存310对应于文件系统层级242,其通过其根块256可识别。在一个实施方式中,对应于文件系统层级的子至父映射的缓存利用文件系统层级的根块来存储,以识别文件系统卷的相应的版本。在一个实施方式中,缓存容器对象用于存储该关联。
图3C是描绘缓存容器块的实施方式的框图。缓存容器块320包括根块访问密钥322以及一个或多个映射块访问密钥324。根块访问密钥322对应于文件系统层级(其对应于存储在子至父映射的缓存中的映射)的根块。映射块访问密钥324对应于存储在内容可寻址存储系统中的一个或多个块。例如,可为一个或多个单个映射数据结构和/或多个映射数据结构(下面在图6中更详细地描述)存储一个或多个映射块访问密钥324。
在一个实施方式中,缓存300存储在与相应文件系统层级的包括根块的对象块不同的块存储中。在这种情况下,根块的访问密钥可进一步包括块存储地址或其他标识符。
确定前体块
子至父映射的缓存可用于确定特定块的前体块。当通过遍历文件系统层级来获得特定块时,该功能可以不是必需的。然而,块不总是需要通过遍历文件系统层级来获得。例如,可通过基于一个或多个块索引执行搜索来返回块。下面参考图6更详细地描述块索引。
为了确定特定块的前体块,使用缓存的子至父映射来获得下一个前体块直至到达根块。下面在图10中更详细地描述使用子至父映射的缓存来确定块的至少一个前体的过程的实施方式。
在一个实施方式中,使用缓存的子至父映射通过获得下一个前体块直至返回文件系统卷的根块来获得特定块的完整路径。例如,在“文件1”的文件系统卷修改之后,可基于缓存310为“文件1”(对象块250)产生路径。对于块250,缓存310包括识别块252(“PPTS”)作为父的子至父映射。对于块252,缓存310包括识别块254(“DOCS”)作为父的子至父映射。对于块254,缓存310包括识别块256(“JACK”)作为父的子至父映射。缓存310不包括用于块256的子至父映射,因为块256是文件系统层级240的根块。基于缓存310的子至父映射,“文件1”的路径是“JACK/DOCS/PPTS/FILE 1”。
更新子至父映射的缓存
如图2所述,文件系统卷的一个或多个修改将使文件系统层级被修改,并且将进一步使得为文件系统卷产生新的根块。在这些修改之后,将需要更新子至父映射的缓存,以反映所修改的文件系统层级,从而将子至父映射的缓存与文件系统卷同步。在一个实施方式中,每当为文件系统卷产生新的根块时,便更新子至父映射的缓存。可替代地和/或此外,可按照基于时间、改变或其他因素的不同间隔更新子至父映射的缓存。
给定与先前文件系统层级的先前根块相关联的子至父映射的缓存的第一版本,可基于与文件系统卷的当前版本对应的文件系统层级的先前根块和新的根块来更新子至父映射的缓存。在一个实施方式中,当根块访问密钥与子至父映射相关联地(诸如在容器块320中)存储时,可简单地通过在一个或多个更新之后提供文件系统层级的新的根块来更新子至父映射的缓存。
子至父映射的缓存可通过如下步骤来更新:(1)基于从新的根块遍历当前文件系统层级的至少一部分来添加一个或多个第一子至父映射,以及(2)基于从先前的根块遍历先前文件系统层级的至少一部分来移除一个或多个子至父映射。基于本文描述的过程,可在与改变(即,块的添加和/或删除)的数量成比例的时间量内执行缓存更新。图4A至图4B是描绘处于修改的子至父映射的缓存的实施方式的框图。下面更详细地描述基于新根块的映射添加和基于先前根块的映射移除。
基于新的根块添加映射
为了更新基于先前的文件系统层级最后更新的子至父映射的缓存,基于当前文件系统层级的新的根块来添加一个或多个子至父映射。从新的根块遍历当前文件系统层级的至少一部分。在遍历中,评估父块与任何其子块的关系。如果确定还需要进一步处理任何特定的子块,则遍历进行至该特定子块的子。在一个实施方式中,遍历实施为在当前父块和其子块上执行的递归过程。在递归调用中,当确定特定子块的子需要被进一步处理时,该特定子块在递归调用期间建立为当前的父块。
在一个实施方式中,对于文件系统层级中的特定块的修改需要产生该特定块的全部前体块的新版本,包括根块的新版本。在这种情况下,可假设可从新的根块遍历当前文件系统层级中的所有新的子至父关系。此外,仅新添加至文件系统层级的块可具有新的子块。当遍历文件系统层级时,这些原则可用于帮助确定不需要被评估的一个或多个块的子树。如本文使用的,术语“子树”可包括任何DAG,包括不具有子的单个节点。
通常,公共的子树(即,被当前文件系统层级和之前的文件系统层级共享的子树)不需要针对新的子至父关系被评估。给定当前文件系统层级的新的根块以及与之前的文件系统层级对应的子至父映射的缓存,可在与新块的数量成比例的时间量内基于新的根块执行添加一个或多个子至父映射的过程。
在一个实施方式中,当处理当前父块时,评估当前父块的每个子块。对于每个子块,如果缓存已经包含从子块到当前父块的子至父映射,则不需要遍历该子块。在这种情况下,子块是之前文件系统层级之间的公共子树的一部分,并且不需要再对该子块执行处理。如果缓存不包含将子块映射至当前父块的子至父映射,则从子块到当前父块的子至父映射添加至缓存。如果缓存在添加之前不包含将子块映射至任何块的任何子至父映射,则需要以与当前父块相同的方式处理该子块。
在一个实施方式中,通过调用评估所述的特定块的子体的递归添加函数来处理子块。最初在当前文件系统层级的根块上调用递归添加函数。以下伪代码概括了适于在与新块的数量成比例的时间量内递归地添加一个或多个子至父映射的递归添加函数的实施方式。
在一个实施方式中,每次对特定块调用递归添加函数时,特定块被添加至新块的列表。新块的列表包括从上次更新而添加至文件系统层级的所有新块。新块的列表可用于执行一个或多个文件系统维护函数,诸如索引更新、文件系统卷大小计算以及其他内容可寻址的存储系统维护活动,在下面更详细地描述其实施方式。
图4A是描绘在映射添加处理之后的子至父映射的缓存的实施方式的框图。缓存400被示出在更新处理的中间。缓存400最初包含与之前的文件系统层级240对应的映射。在基于当前文件系统层级242的根块256的映射添加处理之后,添加以粗体示出的映射。
在一个实施方式中,最初对新的根块256调用递归添加函数。在处理新的根块256的子块254和206时,还对块254调用递归添加函数。在处理块254的子块252和218时,还对子块252调用递归添加函数。在处理块252的子块250、214和216时,还对子块250调用递归添加函数。
调用递归添加函数的次数等于当前文件系统层级242中的不存在于之前的文件系统层级240的新块的数量。在一个实施方式中,因为还对块256、254、252和250调用递归添加函数,所以块266、254、252和250添加至新块的列表,其可用于执行其他内容可寻址的存储系统维护活动。
当递归添加函数被配置为基于图2中示出的顺序从左到右评估特定块的子块时,按照以下顺序评估块:254、252、250、214、216、218、206。类似地,按照402至414的顺序添加子至父映射。
在图8中更详细地描述基于新的根块添加一个或多个子至父映射的处理的实施方式。
基于之前的根块移除映射
为了更新之前与先前文件系统层级同步的子至父映射的缓存,基于先前文件系统层级的先前根块(root chunk)移除一个或多个子至父映射。至少部分先前文件系统层级从先前根块被遍历(traverse)。在遍历的过程中,评估父块和其任意子块之间的关系。如果确定一个或多个特定子块也需要被评估,然后,遍历前进至该特定子块的子(children)。在一个实施方式中,遍历被实施为对当前父块和其子块执行的递归处理。在递归调用中,当确定特定子块的子应当被评估时,特定子块被评估为用于递归调用的持续期间的当前父块。
在基于上述新的根块添加子至父映射之后,子至父映射的缓存包含用于在先前文件系统层级和当前文件系统层级中所有的子至父关系的映射。此时,应该出去仅存在于先前文件系统层级中的所有的子至父关系。可以假设,仅存在于先前文件系统层级中的所有的子至父关系可以从先前根块被遍历。
在一个实施方式中,当处理当前父块时,评估当前父块的每个子块。对应于子块和当前父块之间的关系的映射从子至父映射的缓存中移除。如果缓存仍包含用于子块的另一个子至父映射,则进一步的处理是不必要的,因为来自子块的任何子树将是对当前文件系统层级和先前文件系统层级两者共用的子树。然而,如果缓存不再包含将子块映射至任何块的任何子至父映射,则需要以与当前父块相同的方式处理子块。
在一个实施方式中,描述了通过调用评估特定块的子的递归移除函数(recursiveremove function)来处理子块。对先前文件系统层级的先前根块初始调用递归移除函数。以下的伪代码概括了递归移除函数的实施方式,所述递归移除函数以与不再存在于当前文件系统层级中的所有块的数量成比例的时间量递归地移除一个或多个子至父映射:
在一个实施方式中,每次对特定块调用递归函数,特定块被添加至移除的块的列表。移除的块的列表包括存在于不再存在于文件系统层级的最后更新处的所有的块。移除的块的列表可以被用来执行一个或多个文件系统维护功能,诸如索引更新、文件系统容量大小计算以及其他内容可寻址存储系统维护行为,其实施方式在下文中被更详细地描述。
图4B示出了描述在映射移除处理之后子至父映射的缓存的实施方式的框图。在映射移除处理之后示出缓存450,包括从缓存400作出的所有的改变,缓存400包括先前文件系统层级240和当前文件系统层级242两者中的所有的子至父映射。
在一个实施方式中,对先前根块202初始调用递归移除函数。在处理先前根块202的子块204和206的过程中,还对块204调用递归移除函数。在处理块204的子块208和210的过程中,还对块208调用递归移除函数。在处理块208的子块212、214和216的过程中,还对块212调用递归移除函数。
递归移除函数被调用的次数等于不再存在于新的文件系统层级中的先前文件系统层级240中的所有的块的数量。在一个实施方式中,由于对块202、204、208和212调用递归移除函数,所以,块202、204、208和212被添加至移除的块的列表,其可以被用来执行其他内容可寻址存储系统维护行为。
当递归移除函数被配置为基于图2中的顺序从左至右评估特定块的子块时,按照以下顺序评估块:202、204、209、212、214、216、218、206。同样,子至父映射以452至464的顺序被添加。
在图9中进一步详细描述基于先前根块移除一个或多个子至父映射的处理的实施方式。
文件系统容量改变
当子至父映射的缓存被更新时,可以识别自从最新更新出现的对文件系统层级所有的改变,包括已经被添加至文件系统层级的块的列表和已经从文件系统层级被移除的块的列表。在一个实施方式中,被添加至文件系统层级和/或从文件系统层级被移除的块对应于文件和/或文件夹,并且可以包括链接至对应的文件或文件夹的其他数据和/或元数据块的访问密钥(access key)。
所识别的对于文件系统层级的改变可以被用来执行一个或多个文件系统维护功能,诸如索引更新、文件系统容量大小计算和其他内容可寻址存储系统维护行为。例如,给定文件系统容量的预先计算的大小,通过添加所添加的块的大小并移除所移除的块的大小可以计算文件系统容量的新大小,包括由添加的和/或移除的块参考的任何元数据和/或数据块。在可由树(即,其中,每个节点具有一个父节点)表示的文件系统层级的情况下,这是很直观的。该方法也可以用在文件系统层级可由DAG(即,其中,子曲线可以具有多个父)表示的重要的情况(non-trivial case)下。换句话说,当表示文件系统层级的DAG展开时,我们可以加快计算文件系统层级的真实大小。
维护块索引
内容可寻址存储系统可以被配置为维护一个或多个块索引。如本文中所用的,术语“块索引”指的是将与块相关的数据和/或元数据相关至块的访问密钥(诸如块的哈希值)的索引,诸如全文索引或单一文件索引。在一个实施方式中,块索引的初级密钥是块访问密钥。在一个实施方式中,块索引被配置为索引对象块,所述对象块对应于与一个或多个文件系统容量对应的文件和/或文件夹。块索引还可以被配置为索引与一个或多个文件系统容量中的目录对应的目标块。图5A至图5B为示出了块索引的实施方式的框图。
图5A是示出了块元数据索引的框图。块元数据索引包括对应于一个或多个块的元数据。索引将块的可搜索的元数据与块的访问密钥(诸如块哈希值)相关联。索引可以被用来基于一个或多个搜索条件(search term)来搜索元数据字段并将与搜索条件匹配的块的访问密钥返回。块元数据索引50将多个块的哈希值与对应块的名称元数据、纬度元数据和经度元数据相关联。
图5B是示出了块文本索引的框图。块文本索引包括对应于一个或多个块的文本数据。文本数据可以包括对应于块的经处理的和/或未经处理的文本。索引将可搜索的文本数据与对应的块的访问密钥(诸如对应块的哈希值)相关联。在一个实施方式中,块文本索引包括文件对象块的访问密钥,各所述访问密钥链接至一个或多个块,所述一个或多个块存储对应文件的实际文件数据,并且基于存储在一个或多个块中的实际文件数据产生对应的文本数据。块文件索引510将多个块的哈希值与对应块的经处理的和/或未经处理的文本数据相关联。
当更新子至父映射的缓存时,对于对应的文件系统容量,可以生成添加的块和移除的块的列表。为了使与对应的文件系统容量相关联的索引同步,从文件系统容量移除的块可以被从与文件系统容量相关联的索引移除。对于添加至文件系统容量中的块,在分析添加的块和/或由访问密钥识别的块被存储在添加的块(诸如元数据块和/或文件数据块)之后,可以将新的条目(entry)添加至索引。
子至父映射数据结构
子至父映射的实施可以将每个子至父映射存储为子部的哈希值对对应于一个或多个祖先的一组哈希值之间的相关性。然而,在许多文件系统层级中,最常见的关系将是一对一的子至父关系,其中,大部分的子仅具有一个父。为了最优化子至父映射的存储,子至父映射可以以两个分开的数据结构存储。一个数据结构被优化用于存储从子至单个父的映射,而第二个数据结构被优化用于存储从子至多个父的映射。第二数据结构通常非常小并且可以被容易地缓存。由于第一数据结构比第二数据结构具有更少的迂回,这使得整组子至父映射更紧凑并且更快全部访问。
在一个实施方式中,子至父映射可以被存储为内容可寻址存储系统中的至少一个块。块可以具有多于一个的父,从而多个子至父映射可以对应于特定块。当子块具有多个父块时,多个子至父映射可以被存储为从子块至一组父块的多映射结构,其中,所映射结构表示多个基本的(underlying)子至父映射。
图6是示出了子至父映射的缓存的实施方式的框图。缓存600包括对应于图2的文件系统层级242的文件系统容量的多个子至父映射。缓存600包括单个映射数据结构602和多映射数据结构604。单映射数据结构602被配置为存储针对在文件系统层级242中精确地具有一个父块的块的子至父映射。文件系统层级242中的子块和父块之间的各个一对一映射被存储为单映射数据结构602中的一个条目,在单映射数据结构中,每个条目是哈希至哈希映射。
多映射数据结构604被配置为存储针对在文件系统层级242中具有两个以上父块的块的子至父映射。文件系统层级242中的子块和其父块之间的各个一对多映射被存储为多映射数据结构604中的一个条目。在一个实施方式中,多映射数据结构604的每个条目由内容可寻址存储系统中的哈希至哈希组映射表示。在2013年11月21日提交的、题为“REPRESENTING DIRECTORY STRUCTURE IN CONTENT-ADDRESSABLE STORAGE SYSTEMS”的美国专利申请第14/086,197号中进一步详细地描述了哈希至哈希组映射,其全部内容结合于此作为参考。
在一个实施方式中,文件系统层级242的每个块(除了根块256),由缓存600的单映射数据结构602或多映射数据结构60中的一个关系项精确地表示。当对文件系统容量的修改将特定块的祖先的数量减少为一个,对缓存600的更新可以将特定块从多映射数据结构604移动至单映射数据结构602。当对文件系统容量的修改将特定块的祖先的数量增加至多于一个,对缓存600的更新可以将特定块从单映射数据结构602移动至多映射数据结构604。
更新子至父映射的缓存父的处理
图7是示出了基于新的根块更新子至父映射的缓存的处理的实施方式的流程图。在一个实施方式中,通过块存储服务器112执行处理700。
在框702处,访问文件系统容量。文件系统容量被存储为内容可寻址存储系统中的块的层级。文件系统容量与文件系统层级的第一根块相关联。
在框704处,获得对应于文件系统容量的子至父映射的缓存。在一个实施方式中,从内容可寻址存储系统获得子至父映射的缓存。例如,可以从内容可寻址存储系统的服务器请求子至父映射的缓存。在一个实施方式中,子至父映射的缓存的版本的每一个被存储为内容可寻址存储系统中的一个或多个块。在一个实施方式中,如果子至父映射的缓存对于文件系统容量来说不存在,内容可寻址存储系统的服务器可以被配置为生成用于文件系统容量的子至父映射的缓存。
在框706处,获得新的根块。在一个实施方式中,对文件系统容量的文件系统层级的改变使得新的根块变得与文件系统容量相关联。
在框708处,一个或多个子至父映射被添加至子至父映射的缓存。根据基于新的根块遍历当前文件系统层级的至少一部分来添加一个或多个子至父映射。在一个实施方式中,在当前文件系统层级开始于新的根块被递归地遍历时,一个或多个子至父映射被添加。在图8中描述了基于新的根块添加一个或多个子至父映射的处理的实施方式。
在框710处,从子至父映射的缓存中移除一个或多个子至父映射。根据基于第一根块(即,预先与文件系统容量相关联的根块)遍历先前文件系统层级的至少一部分来移除一个或多个子至父映射。在一个实施方式中,当先前文件系统层级开始于第一根块被递归地遍历时,一个或多个子至父映射被添加。在图9中描述了基于先前根块移除一个或多个子至父映射的处理的实施方式。
添加子至父映射的处理
图8是示出了基于新的根块添加一个或多个子至父映射的处理的实施方式的流程图。处理800通过从新的根块遍历当前文件系统层级的至少一部分,将一个或多个子至父映射添加至子至父映射的缓存。在一个实施方式中,通过块存储服务器112执行处理800。
处理800从新的根块遍历当前文件系统层级的一部分。在一个实施方式中,处理800被实施为对当前父块和其子块执行的递归处理。在递归调用中,子块被建立为递归调用的持续期间的当前父块。处理800开始于框802,使新的根块被建立为当前父块。
在判定框802处,判定当前块是否具有还没有被处理的任何子块。如果当前块具有未处理的子块,处理继续至框804。否则,处理继续至框814,其中,处理800返回。
在框804处,选择当前块的下一子块,其在该部分中被称为“当前子块”。
在判定框806处,判定子至父映射的缓存是否包含从所选择的子块至当前块的映射,在该部分中这应该被称为“当前子至父映射”。如果子至父映射包含当前子至父映射,处理继续至814,其中,处理800返回。当子至父映射的缓存已经包含当前子至父映射,当前子块的子树不必要被评估,因为当前子至父映射在缓存中的存在示出了缓存应该已经包含用于当前子块的子的子至父映射。如果子至父映射的缓存不包含当前子至父映射,处理前进至框808。
在框808处,当前子至父映射被添加至子至父映射的缓存中。
在判定框810处,判定子至父映射的缓存是否包含当前子至父映射的任何子至父映射而不是在框808处被添加的当前子至父映射。如果子至父映射的缓存包含另一映射,则处理继续至框814,其中,处理800返回。当子至父映射的缓存包含另一映射时,当前子块的子树不必要被评估,因为缓存中的从子块的另一映射的存在示出缓存应该已经包含当前子块的子部的子至父映射。如果子至父映射的缓存不包含除了在框808处添加的当前子至父映射之外的另一映射,则处理继续至框812。
在框812处,当前子块被评估为当前父块。处理继续至判定步骤802,并且对新建立的当前父块执行处理800。
在框814处,处理800返回和/或终止。例如,处理可以继续将控制传送至包括递归处理的调用处理,产生任何适当的记录或通知,在方法或功能启用或终止时返回。
用于移除子到父映射的处理
图9是示出用于根据先前根块除去一个或多个子到父的映射的方法的实施方式的流程图。方法900通过从先前根块遍历先前的文件系统层级结构的一部分来从子到父映射的缓存中移除一个或多个子到父的映射。在一个实施方式中,由块存储服务器112执行方法900。
方法900从先前根块遍历先前文件系统层级结构的一部分。在一个实施方式中,方法900被实现为对当前父块和它的子块执行递归处理。在递归调用中,子块被建立为当前父块。方法900开始于框902,其中,先前根块被建立为当前父块。
在判定框902中,判断当前块是否有尚未被处理的任何子块。如果当前块具有未处理的子块,则处理继续到框904。否则,处理继续到框912,其中方法900返回。
在框904,当前块的下一子块被选中,该下一子块在本节应简称为“当前子块。”
在框906,移除从当前子块到当前父块的子到父的映射。
在判定框908,判定子到父的映射的缓存是否包含从当前子块的任何更多的子到父的映射。如果子到父的映射的缓存确实包含从当前子块的另一个子到父的映射,处理继续到框912,其中方法900返回。当子到父的映射的缓存包含从当前子块的另一个子到父映射,并不需要评估当前子块的子树,因为在缓存中存在从当前子块的其他子到父的映射显示,当前子块的子树应该留在子到父的映射的缓存中。然而,在另一个迭代中,它有可能移除从当前子块的最后子到父映射,在这种情况下,对应于当前子块的子树的子到父映射将被移除。如果子到父的映射的缓存中不包含从当前子块的另一个子到父的映射,处理继续到框912。
在框910,当前的子块被建立为当前父块。处理继续到判定步骤902,并且对新建立的当前父块执行方法900。
在框912,方法912返回和/或终止。例如,处理可以继续将控制传递到包括递归处理的调用处理、产生任何适当的记录或通知、方法或函数调用后返回、或以其他方式终止。
用于确定块的祖先的方法
图10是说明用于使用子到父的映射的缓存来确定块的至少一个祖先的方法的实施方式的流程图。方法1000可以在客户端侧执行,例如由块系统客户端110执行。
在框1002中,接收特定块访问密钥。在一个实施方式中,特定块的访问密钥基于特定块产生,如特定的哈希值。特定块地址可被接收,作为使用块索引返回的搜索结果。
在框1004中,利用访问密钥从内容可寻址存储系统中获得特定块。在一个实施方式中,特定块是与特定文件相关联的文件对象块。文件对象块包括存储有特定文件的文件数据的数据块的访问密钥。在一个实施方式中,文件对象块还包括存储有特定文件的元数据的元数据块的访问密钥。
在框1006中,提供了对应于该特定块的文件。在一个实施方式中,块系统客户端110通过使用第一访问密钥获得与该文件相关联的文件对象块,获得存储在与文件数据对应的文件对象块中的第二访问密钥,使用第二密钥获得与文件对应的文件数据,来将对应文件提供至文件系统客户端106的另一个应用。对应于该特定块的文件可以通过文件系统客户端106进行修改。
在框1008,该文件被修改后,保存修改后的文件。为了保存该文件,至少一个新块存储在内容可寻址存储系统中。当文件被修改时,通过将修改后的文件作为一个或多个块存储在内容可寻址存储系统中,来保存修改后的文件到内容可寻址存储系统。在一个实施方式中,修改后的文件数据被存储为一个或多个文件数据块,和用于文件数据块的访问密钥被存储在与该修改后的文件对应的新文件对象块。
在框1010,该特定块中的至少一个祖先块被确定。特定块的至少一个祖先块是基于与在其中存储文件的文件系统相关联的子到父的映射的缓存来确定。
在框1012中,基于该至少一个祖先块和对应于该修改后的文件的新块产生至少一个新的父块。对于每个修改块,产生的一个新的父块包括修改后的块的访问密钥。在一个实施方式中,在修改的文件的路径中,针对每个祖先块产生新块,包括文件系统卷的新的根块。
硬件概要
根据一个实施方式,本文中描述的技术通过一个或多个专用计算设备来实现。专用计算设备可以是硬连线以执行技术,或者可以包括数字电子设备,例如一个或多个应用专用集成电路(ASIC)或持续编程以执行所述技术的现场可编程门阵列(FPGA),或者可以包括编程为根据在固件、存储器、其它存储器中的程序指令来执行技术的一个或多个通用硬件处理器,或组合。这种专用计算设备也可以结合定制硬布线逻辑、专用集成电路、或FPGA、与定制编程来实现所述技术。专用计算设备可以是台式计算机系统、便携式计算机系统、手持设备、网络设备、或并入硬连线和/或程序逻辑来实现技术的任何其它设备。
例如,图11是示出了计算机系统1100的框图,根据计算机系统可以实施本发明的实施方式。计算机系统1100包括总线1102或用于传送信息的其他通信机制,以及耦接至总线1102用于处理信息的硬件处理器1104。硬件处理器1104可以是,例如,一般用途微处理器。
计算机系统1100还包括主存储器1106,诸如随机存取存储器(RAM)或其他动态存储设备,其耦接到总线1102用于存储信息和指令以由处理器1104来执行。主存储器1106也可以是用于存储在由处理器1104执行指令的执行指令期间的临时变量或其它中间信息。这些指令在存储在处理器1104可访问的非暂存性存储介质时,使计算机系统1100成为专用机器,该专用机器被定制为执行使指令所指定的操作。
计算机系统1100进一步包括耦合至总线1102的只读存储器(ROM)1108或其他存储设备,用于存储用于处理器1104的静态信息和指令。诸如磁盘、光盘、或固态驱动器的存储设备1110被设置并耦接至总线1102用于存储信息和指令。
计算机系统1100可以经由总线1102被耦接到显示器1112,例如阴极射线管(CRT),用于显示信息给计算机用户。包括字父数字和其它键的输入设备1114耦接至总线1102,用于将信息和命令选择传送至处理器1104。另一种类型的用户输入设备是光标控制1116,例如鼠标、轨迹球或光标方向键,用于传送方向信息和命令选择至处理器1104并用于在显示器1112上控制光标移动。通常,该输入设备在两个轴,允许设备指定平面中的位置的第一轴(例如,x)和第二轴(例如,y)具有两个自由度。
计算机系统1100可使用定制硬布线逻辑、一个或多个ASIC或FPGA、固件和/或程序逻辑实施本文中所描述的技术,该程序逻辑与计算机系统组合使或编程计算机系统1100成为专用机器。根据一个实施方式,本文中的技术是由计算机系统1100响应于处理器1104执行主存储器1106中包含的一个或多个指令的一个或多个序列来执行。这种指令可从另一存储介质中,例如存储设备1110读取到主存储器1106。执行被包含在主存储器1106的指令的序列使得处理器1104执行本文描述的处理步骤。在替代实施方式中,硬连线电路可以被用来代替软件指令或与软件指令组合使用。
如本文所使用的术语“存储介质”指的是存储使机器以特定方式操作的数据和/或指令的任何非暂存性的介质。这样的存储介质可以包括非易失性介质和/或易失性介质。非易失性介质包括,例如,光盘、磁盘、或固态驱动器,例如存储设备1110。易失性介质包括动态存储器,诸如主存储器1106。存储介质的常见形式包括,例如,软盘、柔性盘、硬盘、固态驱动器、磁带、或任何其它磁性数据存储介质、CD-ROM、任何其它光学数据存储介质、具有孔图案的任何物理介质、RAM、PROM、和EPROM、FLASH-EPROM、NVRAM、任何其它存储芯片或盒式磁带。
存储介质与传输介质不同,但可以与传输介质一起使用。传输介质参与在存储介质之间传送信息。例如,传输介质包括同轴电缆、铜线和光纤,包括包含总线1102的电线。传输介质还可以采取声波或光波,例如那些在无线电波和红外线数据通信中产生的波。
各种形式的介质可以涉及携带一个或多个指令的一个或多个序列到处理器1104用于执行。例如,指令最初可以承载在远程计算机的磁盘或固态驱动器上。远程计算机可以将指令加载到其动态存储器中并且使用调制解调器通过电话线发送指令。计算机系统1100的本地的调制解调器可以接收电话线上的数据,并使用红外发射器将数据转换为红外信号。红外线检测器可以接收在红外信号上承载的数据和适当的电路可将数据放置在总线1102上。数据总线1102将数据携带至主存储器1106,处理器1104从该主存储器检索并执行指令。由主存储器1106接收的指令可任选地在由处理器1104执行之前或之后存储在存储设备1110上。
计算机系统1100还包括耦接到总线1102的通信接口1118。通信接口1118提供了耦合到网络链路1120的双向数据通信,网络链路1120被连接到本地网络1122。例如,通信接口1118可以是综合业务数字网(ISDN)卡、电缆调制解调器、卫星调制解调器或调制解调器,以提供至相应类型的电话线的数据通信连接。作为另一例子,通信接口1118可以是局域网(LAN)卡,以提供至兼容的LAN的数据通信连接。也可以实现无线链路。在任何这种实现中,通信接口1118发送和接收携带表示各种类型的信息的数字数据流的电、电磁或光信号。
通常,网络链路1120通过一个或多个网络提供到其他数据设备的数据通信。例如,网络链路1120可以通过本地网络1122提供到主计算机1124的连接或到由互联网服务提供商(ISP)1126所运行的数据设备。ISP 1126又通过现在通常称为“互联网”1128的全球分组数据通信网络提供数据通信服务。本地网络1122和互联网1128都使用承载数字数据流的电、电磁或光信号。通过各个网络的信号以及在网络链路1120和通过通信接口1118的信号,其携带数字数据来往于计算机系统1100,是传输介质的示例形式。
计算机系统1100可以通过一个或多个网络、网络链路1120和通信接口1118发送消息和接收数据,包括程序代码。在互联网示例中,服务器1130可以通过互联网1128、ISP1126、本地网络1122和通信接口1118发送应用程序的请求代码。
接收到的代码在其被接收时可以由处理器1104执行,和/或存储在存储设备1110或其他非易失性存储器中用于稍后执行。
扩展和替换
在前述的说明书中,本发明的实施方式已经参照可从实施例到实施例改变的大量的具体细节进行了描述。说明书和附图相应地应被认为是说明性的而不是限制性意义的。本发明范围的唯一和排他的指示以及本申请人所旨在成为本发明范围的内容,是在本申请发布的权利要求书的字面和等效范围,位于该权利要求所发布的包括任何后续的修正的具体的形式中。