书签 分享 收藏 举报 版权申诉 / 17

一种组织和访问分布式文件系统目录的方法.pdf

  • 上传人:111****11
  • 文档编号:638845
  • 上传时间:2018-02-28
  • 格式:PDF
  • 页数:17
  • 大小:1,005.21KB
  • 摘要
    申请专利号:

    CN200410009926.3

    申请日:

    2004.12.02

    公开号:

    CN1614591A

    公开日:

    2005.05.11

    当前法律状态:

    授权

    有效性:

    有权

    法律详情:

    专利权的转移 IPC(主分类):G06F 17/30登记生效日:20170630变更事项:专利权人变更前权利人:中国科学院计算技术研究所变更后权利人:北京中科吉因科技有限公司变更事项:地址变更前权利人:100080 北京市中关村科学院南路6号变更后权利人:100190 北京市海淀区科学院南路6号科研综合楼10层1044室|||授权|||实质审查的生效|||公开

    IPC分类号:

    G06F17/30

    主分类号:

    G06F17/30

    申请人:

    中国科学院计算技术研究所;

    发明人:

    唐荣锋; 孟丹; 吴思宁

    地址:

    100080北京市中关村科学院南路6号

    优先权:

    专利代理机构:

    中科专利商标代理有限责任公司

    代理人:

    周国城

    PDF完整版下载: PDF下载
    内容摘要

    本发明涉及计算机存储系统技术领域,特别是一种组织和访问分布式文件系统目录的方法。该方法采用动态可扩展Hash技术来组织文件系统的目录:分别使用两个本地文件系统中的文件存放索引结构(Hash表)和目录的内容,Hash表可以动态扩展;本发明中的Hash表是多层次的,不同的目录项块可以对应不同位数的Hash值有效位;为避免索引结构的过于膨胀超出本地文件系统的限制,限定Hash值有效位的上限;针对顺序读取目录内容,提出了一个按目录项有效位的宽度串行搜索方法,避免重复读取或者漏读某些目录项。这种方法适用于任何利用本地文件系统存放元数据的分布式文件系统。

    权利要求书

    1.  一种组织和访问分布式文件系统目录的方法,该方法采用可扩展的Hash技术来组织计算机文件系统的目录,一个目录项块对应一个有效的Hash值,随着目录规模的增大,Hash值的有效位数不断增加,Hash表的规模也不断增长;针对分布式文件系统的任何一个目录使用分布式文件系统元数据管理服务器所在计算机的本地文件系统中的两个独立的文件分别存放目录的索引结构和目录的内容;该方法采用的是多层次的Hash表,允许不同的目录项块对应的Hash值的有效位数可以不同;为避免Hash表的不断膨胀,限制有效位数增长的上限值;针对顺序读取目录项内容提出了按目录项有效位的宽度串行搜索方法,避免重复读取目录项或者遗漏目录项;该方法在元数据管理服务器内部实现为一个模块,向元数据管理服务器提供修改和读取目录内容的函数,完成任何针对目录内容的操作,
    该方法由四个子方法构成,分别为:
    1)增加目录项的方法,该子方法提供给元数据服务器,用于往指定的目录中增加一个目录项;
    2)目录项查询方法,该子方法由元数据服务器调用,用于在指定的目录下查找一个指定名字的目录项;
    3)顺序读取目录内容的处理方法,该子方法提供给元数据服务器,用于处理readdir等顺序读取目录的方法;
    4)目录项块存放后的分裂方法,该子方法确定了在本发明中,针对目录项块存满后所需要进行的处理,该子方法被上述1)中增加目录项的方法所调用。

    2.
      根据权利要求1的组织和访问分布式文件系统目录的方法,其特征在于,目录项块存放后的分裂方法,其分裂过程步骤如下:
    a)如果目录项块blk的local_depth小于global_depth:
    I.将目录项块blk的local_depth的值直接设为global_depth;
    II.针对目录项块blk中的每一个目录项作如下操作:
    重新计算目录项的hash值,取hash值的低local_depth位,记为cur_value,判断cur_value是否与目录项块blk所对应的索引结构在hash表中序号相同,如果相同,则无需做任何处理,如果不同,则需要将该目录项移到其他目录项块中,根据cur_value值,找到对应的索引结构,此时分为两种情况:
    i.如果索引结构中指定了对应的目录项块在目录项文件中的偏移地址,说明目标目录项块已经存在,则直接将该目录项从原目录项块中删除,加入到目标目录项块中,这样对这个目录项的处理完成;
    ii.如果索引结构没有指定对应的目录项块在目录项文件中的偏移地址,则说明目标目录项块不存在,这时从目录项文件末尾分配一个目录项块,将目录项块在目录项文件中的偏移地址记录到索引结构中,新增的目录项块的local_depth等于global_depth,然后将目录项从原目录项块blk中移到新增的目录项块中,
    III.分裂结束;
    b)如果目录项块blk的local_depth等于global_depth,此时分两种情况:
    I.global_depth已经达到最大所允许的有效位数的上限值,如果已经存在有一个以上的目录项块由于与目录项块blk具有相同的hash值,而构成一个队列,则查询该队列的最后一个目录项块中是否有空闲的空间足够容纳新增的目录项,如果有,则将该新增的目录项加入即可,如果没有该队列的存在或者队列末尾的目录项块也已经存满,则在目录项文件的末尾分配一个新的目录项块,与目录项块blk连成一个队列,新增目录项块放在队列的末尾,队列指针,即队列中后一个目录项块在目录项文件中的偏移地址,存放在队列前一个目录项块的最末尾8个字节中,新增的目录项加入到该新的目录项块中;
    II.如果global_depth小于最大所允许的有效位数的上限值:
    i.将global_depth的值增一,并将新的global_depth值赋给目录项块blk的local_depth;
    ii.针对目录项块blk中的每一个目录项,做如下操作:
    重新计算目录项的hash值,取hash值的低local_depth位,记为cur_value,判断cur_value是否与目录项块blk所对应的索引结构在hash表中序号相同,如果相同,则无需做任何处理,如果不同,则需要将该目录项移到其他目录项块中,根据cur_value值,找到对应的索引结构,此时将分两种情况:
    i)如果索引结构中指定了对应的目录项块在目录项文件中的偏移地址,说明目标目录项块已经存在,则直接将该目录项从原目录项块中删除,加入到目标目录项块中,这样对这个目录项的处理完成;
    ii)如果索引结构没有指定对应的目录项块在目录项文件中的偏移地址,则说明目标目录项块不存在,这时从目录项文件末尾分配一个目录项块,将目录项块在目录项文件中的偏移地址记录到索引结构中,新增的目录项块的local_depth等于global_depth,然后将目录项从原目录项块blk中移到新增的目录项块中。

    3.
      根据权利要求1的组织和访问分布式文件系统目录的方法,其特征在于,增加目录项的方法,其步骤如下:
    a)计算指定目录项名字的Hash值;
    b)从索引文件中获得此时该目录的全局深度global_depth,将它存放到一个临时变量tmp_depth中;
    c)取a)中计算的hash值的二进制数的低tmp_depth位为当前的有效位,记为eff_value;
    d)从索引文件中偏移为eff_value的位置取出相应的索引结构;
    e)如果所取到的索引结构为空,tmp_depth的值减一,回到c);否则,从索引结构中获得对应目录项块在目录项文件中的地址,取出目录项块blk;
    f)如果blk已满,则调用分裂函数,进行分裂操作,分裂结束后将tmp_depth的值增1,转到c)处,如果blk未满,还有能够容纳该目录项的空闲空间,则继续往下执行;
    g)如果当前目录项块blk的局部深度local_depth等于全局深度global_depth,则将目录项存放在blk中合适的位置,本函数结束;如果local_depth<global_depth,则对blk块调用分裂函数进行分裂操作。分裂结束后,将blk的local_depth设为global_depth,tmp_depth的值设为此时global_depth的值,转到c)处执行。

    4.
      根据权利要求1的组织和访问分布式文件系统目录的方法,其特征在于,目录项查询方法,其具体步骤如下:
    a)计算指定文件名的Hash值;
    b)从索引文件中获取要查找的文件系统对象所在目录的全局深度global_depth,并将它记录在tmp_depth中;
    c)取a)中计算的Hash值对应的二进制数的低tmp_depth位的值作为有效值,赋给eff_value;
    d)从索引文件中偏移为eff_value的位置处取出索引结构;
    h)如果索引结构的内容为空,则将tmp_depth的值减一,回到c);
    否则,从索引结构中获得对应目录项块在目录项文件中的地址,取出目录项块blk;
    e)从blk中搜索文件名等于指定名字的目录项,如果找到则返回找到的目录项,该函数结束;否则,如果目录项块blk的局部深度local_depth的值小于全局深度global_depth,说明指定名字的目录项在该目录下不存在,该函数结束;如果目录项块blk的局部深度local_depth的值等于全局深度global_depth,并且global_depth已经达到了上限,此时,如果blk之后还有其它与blk具有相同的hash值构成的链表,则依次搜索该链表上的所有目录项块,如果找到则返回目录项,搜索完毕,该函数结束。

    5.
      根据权利要求1的组织和访问分布式文件系统目录的方法,其特征在于,顺序读取目录内容的处理方法,其具体步骤如下:
    a)如果某个访问过的目录项块的局部深度小于全局深度,则在此次顺序读取目录内容的操作中,不访问其分裂后生成的目录项块;
    b)为最后访问的目录项块定义一个二元组(orig_b,orig_depth),其中,orig_b表示最后一次访问该目录项块时的hash有效值,orig_depth表示最后一次访问该目录项块时的局部深度,如果最后一次只是访问目录项块的部分内容而不是读取整个块,则需要将该二元组传送给访问者;
    c)在索引结构中增加一项off_within_bucket用于记录分裂后生成的目录项块从被分裂的目录项块中移过来的最后一个目录项所存放的位置;
    d)如果最后一次readdir操作只读取了某个目录项块的部分内容,当后续的readdir操作读取该目录项块的剩余部分内容时,需要对访问者提供的二元组进行判断:如果orig_b等于当前的目录项块的hash有效值,并且orig_depth也等于该目录项块的当前局部深度,说明该目录项块在两次读操作之间没有被分裂,则直接读取剩余内容即可;如果orig_depth小于该目录项块的当前局部深度,说明在该readdir操作之前已经进行了分裂,则将所有本目录项块分裂后生成的目录项块中其索引结构中的off_within_bucket指定位置之前的所有目录项组成一个临时的目录项块,将该临时目录项块中本次readdir指定位置之后的目录项传送给访问者。

    说明书

    一种组织和访问分布式文件系统目录的方法
    技术领域
    本发明涉及计算机存储系统技术领域,特别是一种组织和访问分布式文件系统目录的方法。
    背景技术
    随着计算机技术的飞速发展、信息量的与日俱增,存储系统已经成为计算机系统尤其是大型分布式计算机系统的瓶颈。分布式文件系统可以方便有效地管理存储系统,并充分发挥存储子系统的性能。附图1给出了分布式文件系统的典型结构,分布式文件系统由多个服务器和多个客户端组成。按照功能,从逻辑上可以将服务器划分为元数据管理服务器和存储服务器。
    研究人员发现,在目前大多数应用中,元数据操作的数量远远大于普通的文件读写数量,而绝大多数的元数据操作是针对文件系统目录的,可以分为两类:一类是在已存在的目录下增加或删除一个目录项;另一类是在一个目录下查询指定名字的目录项。目录的规模将随着目录项的增加而不断膨胀。
    当前的应用,特别是大规模科学计算和事务处理,越来越趋向于在一个目录下存放大量的文件系统对象(文件和子目录),这就迫切要求分布式文件系统具有有效地支持在大目录中快速的增加或者查找某一个目录项的能力。
    目前,绝大多数分布式文件系统都采用线性的方式或者平衡二叉树的方式组织文件系统目录。
    对于线性组织方式,每当往文件系统的某个目录中增加一个目录项,需要从头至尾查找足够容纳新增目录项的空闲空间;当查找指定名字的目录项时,也需要顺序地查询相应目录中的所有目录项,逐一对比文件名。这种方式的效率将随着目录规模的增大而下降。
    平衡二叉树的方法将目录的内容存放在二叉树的节点中。与线性的方式相比,具有更高的效率,但是,为了确保效率,该方法需要在增加和删除目录项的操作过程中,及时地调整二叉树,使得它仍旧保持平衡,这种调整过程将对性能造成很大的影响。在该种方法中,增加和查找目录项需要从二叉树的根部开始往树的叶子方向依次查找路径中的每个节点,当目录的规模越大,树的深度增加,这种方法的搜索路径越长,它的效率也就相应的下降。
    鉴于现有的技术都无法满足分布式文件系统高效地支持大目录操作的需求,提出一种高效地组织和访问目录的技术有着重要的意义。
    针对这种需求,我们提出了一种新的方法:多层次的、受限的、动态可扩展Hash技术。
    发明内容
    本发明的目的在于,提供一种新的组织和访问分布式计算机文件系统目录的方法,该方法通过对分布式计算机文件系统按照一定的结构进行组织,并提供专门的修改和访问目录的函数,使得采用该方法的文件系统能够提高目录操作的效率。
    特别是针对需要同时处理大量文件的分布式计算机文件系统,以提高这种系统支持多个计算机节点同时创建、删除及查找文件和目录的速度。
    本发明是一种新的组织和访问文件系统目录的方法,其步骤为:
    1)采用可扩展的Hash技术来组织文件系统的目录,一个目录项块对应一个有效的Hash值,随着目录规模的增大,Hash值的有效位不断增加,Hash表的规模也不断增长;
    2)使用分布式文件系统元数据管理服务器所在计算机的本地文件系统中的两个独立的文件分别存放目录地索引结构和目录的内容;
    3)该方法采用的是多层次的Hash表,允许不同的目录项块对应的Hash值的有效位可以不同;
    4)为避免Hash表的不断膨胀,限制有效位数增长的上限值;
    5)针对顺序读取目录项内容提出了按目录项有效位的宽度串行搜索方法,避免重复读取目录项或者遗漏目录项;
    6)该方法在元数据管理服务器内部实现为一个功能模块,向元数据管理服务器提供修改和读取目录内容的函数,完成任何针对目录内容的操作。
    所述的组织和访问分布式文件系统目录的方法,采用多层次、受限的、动态可扩展Hash技术来组织文件系统的目录,一个目录项块对应一个有效的Hash值,随着目录规模的增大,Hash值的有效位不断增加,Hash表的规模也不断增长;针对分布式文件系统中的任何一个目录使用分布式文件系统元数据服务器在计算机本地文件系统中的两个独立的文件分别存放目录的索引结构和目录的内容;该方法采用的是多层次的Hash表,允许不同的目录项块对应的Hash值的有效位可以不同;
    为避免Hash表的不断膨胀,限制有效位数增长的上限值;针对顺序读取目录项内容提出了按目录项有效位的宽度串行搜索方法,避免重复读取目录项或者遗漏目录项;该方法在元数据管理服务器内部实现为一个模块,向元数据管理服务器提供修改和读取目录内容的函数,完成任何针对目录内容的操作,
    该方法采用如下技术实现目录的管理:(1)针对每一个分布式文件系统的目录提供两个本地磁盘中的文件:一个是目录项文件,存放该目录的所有目录项,它按固定大小的块进行组织,同一块中的目录项的Hash值相同;另一个是索引文件,可以将整个索引文件看作一个Hash表,而Hash表的每一个入口项是与该Hash值对应的索引结构,用于记录相应Hash值所对应的块在目录项文件中的位置,以及一些与动态Hash技术相关的信息,在下述内容中会详细描述。Hash值对应索引结构在索引文件中的序号,例如,假设Hash值为n,索引结构的大小为size,则该Hash值对应的索引结构在索引文件中的位置就是:n*size,从该位置读取索引结构,然后就可以获得该目录项所在块在目录项文件中的位置。为了避免在Hash函数值不均匀时Hash表的过度膨胀造成索引文件的急剧增长,我们限定Hash值最大有效位位数;(2)为了避免Hash表分裂时修改表项和将Hash表写回计算机磁盘的开销,该方法维护了一个多层次的Hash表,即每个Hash表项的有效位数可以不同。下面针对几个重要的目录操作分别进行说明,其中目录块的标号均以二进制的方式表示。
    本发明——一种组织和访问分布式文件系统目录的方法,共由四个关键的子方法构成,分别为:目录项块的分裂方法、增加目录项的方法、查找指定名字的目录项的方法以及顺序读取目录内容的处理方法,下面详细说明每一种子方法的具体流程。
    (1)目录项块的分裂方法,该子方法确定了在本发明中,针对目录项块存满后所需要进行的处理,该子方法被(2)增加目录项的方法中,增加目录项的方法所调用。
    当某一个目录项块已经存满目录项,再往里增加目录项时,必须对其进行分裂,动态扩展其索引文件的大小,这是本发明中的关键部分。在描述具体的分裂方法之前先作如下的前提说明。
    使用全局深度global_depth记录当前时刻的最大有效位数(这个值记录在索引文件的某个固定位置,一般在文件的开头),同时在每一个索引结构中加入局部深度local_depth表示该目录项块所对应的有效位数。每一次分裂后相应被分裂的块和分裂后生成块的local_depth都等于此时的global_depth。
    如果是往一个local_depth小于global_depth的目录项块中增加一个目录项,此时,为了在后续的查找和增加目录项的操作更为简单,将该块进行分裂,根据目录项的Hash值将该块中的目录项移到对应的索引结构所指向的块中,此时,这些索引结构都为空,因此在移入第一个目录项的之前,为其从目录项文件的末尾分配一块,并将原来的目录块所对应的索引结构中的local_depth置为global_depth,其它新分配块的索引结构中的local_depth也作同样的设置,而此时global_depth不用变。
    由此可知,只有当local_depth=global_depth的块被分裂时,global_depth的值才需要增一,否则(local_depth<global_depth),只需将local_depth设为global_depth即可。这种延迟分裂的策略,即提高了效率,同时也节省了索引文件和目录项文件的空间。
    为了避免由于Hash函数的不均匀造成索引文件的急剧膨胀,在此,设置global_depth的增长上限,当分裂过程中发现global_depth达到该上限值后,任何local_depth=global_depth的块不再进行分裂,而是为该索引分配另外一个目录项块,并将属于该索引结构的所有目录项块链接起来。
    整个分裂过程在本方法中以一个函数的形式提供给元数据服务器调用,假设当前目录项块blk已经存满,此时往里增加一个新的目录项,则必须进行分裂,其详细分裂过程如下:
    a)如果目录项块blk的local_depth小于global_depth:
    I.将目录项块blk的local_depth的值直接设为global_depth;
    II.针对目录项块blk中的每一个目录项作如下操作:
    重新计算目录项的hash值,取hash值的低local_depth位,记为cur_value,判断cur_value是否与目录项块blk所对应的索引结构在hash表中序号相同。如果相同,则无需做任何处理。如果不同,则需要将该目录项移到其他目录项块中。根据cur_value值,找到对应的索引结构,此时分为两种情况:
    i.如果索引结构中指定了对应的目录项块在目录项文件中的偏移地址,说明目标目录项块已经存在,则直接将该目录项从原目录项块中删除,加入到目标目录项块中,这样对这个目录项的处理完成。
    ii.如果索引结构没有指定对应的目录项块在目录项文件中的偏移地址,则说明目标目录项块不存在,这时从目录项文件末尾分配一个目录项块,将目录项块在目录项文件中的偏移地址记录到索引结构中,新增的目录项块的local_depth等于global_depth。然后将目录项从原目录项块blk中移到新增的目录项块中。
    III.分裂结束。
    b)如果目录项块blk的local_depth等于global_depth,此时分两种情况:
    I.global_depth已经达到最大所允许的有效位数的上限值。如果已经存在有一个以上的目录项块由于与目录项块blk具有相同的hash值,而构成一个队列,则查询该队列的最后一个目录项块中是否有空闲的空间足够容纳新增的目录项,如果有,则将该新增的目录项加入即可。如果没有该队列的存在或者队列末尾的目录项块也已经存满,则在目录项文件的末尾分配一个新的目录项块,与目录项块blk连成一个队列,新增目录项块放在队列的末尾,队列指针(即队列中后一个目录项块在目录项文件中的偏移地址)存放在队列前一个目录项块的最末尾8个字节中,新增的目录项加入到该新的目录项块中。
    II.如果global_depth小于最大所允许的有效位数的上限值:
    i.将global_depth的值增一,并将新的global_depth值赋给目录项块blk的local_depth。
    ii.针对目录项块blk中的每一个目录项,做如下操作:
    重新计算目录项的hash值,取hash值的低local_depth位,记为cur_value,判断cur_value是否与目录项块blk所对应的索引结构在hash表中序号相同。如果相同,则无需做任何处理。如果不同,则需要将该目录项移到其他目录项块中。根据cur_value值,找到对应的索引结构,此时将分两种情况:
    i)如果索引结构中指定了对应的目录项块在目录项文件中的偏移地址,说明目标目录项块已经存在,则直接将该目录项从原目录项块中删除,加入到目标目录项块中,这样对这个目录项的处理完成。
    ii)如果索引结构没有指定对应的目录项块在目录项文件中的偏移地址,则说明目标目录项块不存在,这时从目录项文件末尾分配一个目录项块,将目录项块在目录项文件中的偏移地址记录到索引结构中,新增的目录项块的local_depth等于global_depth。然后将目录项从原目录项块blk中移到新增的目录项块中。
    (2)增加目录项的方法,该子方法提供给元数据服务器,用于往指定的目录中增加一个目录项;
    增加目录项的函数传入的参数为对应指定名字的目录项和该目录项所应该存放的目录。其详细过程如下:
    a)计算指定目录项名字的Hash值;
    b)从索引文件中获得此时该目录的全局深度global_depth,将它存放到一个临时变量tmp_depth中;
    c)取a)中计算的hash值的二进制数的低tmp_depth位为当前的有效位,记为eff_value
    d)从索引文件中偏移为eff_value*(索引结构大小)的位置取出相应的索引结构;
    e)如果所取到的索引结构为空,tmp_depth的值减一,回到c);否则,从索引结构中获得对应目录项块在目录项文件中的地址,取出目录项块blk;
    f)如果blk已满,则调用分裂函数,进行分裂操作。分裂结束后将tmp_depth的值增1,转到c)处。如果blk未满,还有能够容纳该目录项的空闲空间,则继续往下执行。
    g)如果当前目录项块blk的局部深度local_depth等于全局深度global_depth,则将目录项存放在blk中合适的位置,本函数结束;如果local_depth<global_depth,则对blk块调用分裂函数进行分裂操作。分裂结束后,将blk的local_depth设为global_depth,tmp_depth的值设为此时global_depth的值,转到c)处执行;
    (3)查找指定名字的目录项的方法,该子方法由元数据服务器调用,用于在指定的目录下查找一个指定名字的目录项;
    该函数用于查找某个指定名字的目录项,主要是服务于分布式文件系统客户端的lookup请求。该函数的参数是指定的文件系统对象(文件或者子目录)的名字和该对象所在的目录。具体过程如下:
    a)计算指定文件名的Hash值;
    b)从索引文件中获取要查找的文件系统对象所在目录的全局深度global_depth,并将它记录在tmp_depth中;
    c)取a)中计算的Hash值对应的二进制数的低tmp_depth位的值作为有效值,赋给eff_value;
    d)从索引文件中偏移为eff_value*(索引结构大小)的位置处取出索引结构;
    h)如果索引结构的内容为空,则将tmp_depth的值减一,回到c);否则,从索引结构中获得对应目录项块在目录项文件中的地址,取出目录项块blk;
    e)从blk中搜索文件名等于指定名字的目录项,如果找到则返回找到的目录项,该函数结束;否则,如果目录项块blk的局部深度local_depth的值小于全局深度global_depth,说明指定名字的目录项在该目录下不存在,该函数结束;如果目录项块blk的局部深度local_depth的值等于全局深度global_depth,并且global_depth已经达到了上限,此时,如果blk之后还有其它与blk具有相同的hash值构成的链表,则依次搜索该链表上的所有目录项块,如果找到则返回目录项,搜索完毕,该函数结束。
    (4)顺序读取目录内容的处理的方法,该子方法提供给元数据服务器,用于处理readdir等顺序读取目录的方法;
    UNIX和类UNIX操作系统比如LINUX都提供了顺序读取目录内容的命令程序,比如ls,这种程序从一个目录的某个位置开始多次调用readdir操作顺序读取一定量的目录内容。由于目录项块在多个readdir操作之间可能由于加入新的目录项而造成分裂,使得之前有些已经读取过的内容被重复地访问或者在此次ls操作中遗漏某些目录项,为此,我们专门针对顺序读取目录内容提出了一种名为按目录项有效位的宽度串行搜索方法。本方法有两个特点:
    (1)如果目录项块的局部深度小于全局深度,则该目录项块分裂后对应的那些目录项块当前都为空。例如,如果全局深度为5,一个目录项块对应的hash有效值的二进制数为101,即它的局部深度为3,则此时对应hash有效值的二进制数01101,10101,11101的目录项块都不存在;
    (2)被分裂的目录项块中的目录项只会被移到hash有效值更大的目录项块中。根据这两个特点,针对顺序读取目录内容的操作做如下处理:
    a)如果某个访问过的目录项块的局部深度小于全局深度,则在此
    次顺序读取目录内容的操作中,不访问其分裂后生成的目录项块。例如,假设全局深度为5,某个目录项块在访问的时候的局部深度为3,对应的hash有效值为101,在读取该目录项块结束后,但本次顺序读取目录内容的操作结束前,该目录项块进行分裂,生成了对应hash值为10101、01101、11101的目录项块,则在本次顺序读取目录内容的操作中将跳过这些新生成的目录项块。
    b)为最后访问的目录项块定义一个二元组(orig_b,orig_depth),其中,orig_b表示最后一次访问该目录项块时的hash有效值,orig_depth表示最后一次访问该目录项块时的局部深度。如果最后一次只是访问目录项块的部分内容而不是读取整个块,则需要将该二元组传送给访问者。
    c)在索引结构中增加一项off_within_bucket用于记录分裂后生成的目录项块从被分裂的目录项块中移过来的最后一个目录项所存放的位置。
    d)如果最后一次readdir操作只读取了某个目录项块的部分内容,当后续的readdir操作读取该目录项块的剩余部分内容时,需要对访问者提供的二元组进行判断:如果orig_b等于当前的目录项块的hash有效值,并且orig_depth也等于该目录项块的当前局部深度,说明该目录项块在两次读操作之间没有被分裂,则直接读取剩余内容即可;如果orig_depth小于该目录项块的当前局部深度,说明在该readdir操作之前已经进行了分裂,则将所有本目录项块分裂后生成的目录项块中其索引结构中的off_within_bucket指定位置之前的所有目录项组成一个临时的目录项块,将该临时目录项块中本次readdir指定位置之后的目录项传送给访问者。
    附图说明
    为进一步说明本发明的技术特征,以下结合实施实例及附图详细说明于后,其中:
    图1是典型分布式文件系统结构图。
    图2是本发明的目录项块分裂的过程图。
    具体实施方式
    图1的分布式文件系统的典型结构,分布式文件系统由多个服务器和多个客户端组成。按照功能,从逻辑上可以将服务器划分为元数据管理服务器和存储服务器。
    图2索引文件中的标号都是二进制数。下文中给出的目录项块的标号也为二进制数。
    图2给出了目录块分裂过程的示意图。图2(1)子图为有效位为1位时索引文件和目录项文件结构,其中序号为1的索引结构对应的深灰色块Blk1表示该目录项块已满,此时需要将它分裂为两块,新增的块Blk2直接从目录项文件的末尾分配存储空间(对目录项文件执行append操作),并将它在目录项文件中的偏移赋给图2(2)中标号为11的索引结构,global_depth增加为2,块号为11的目录块的local_depth也置为2,而标号为10的索引结构此时在索引文件中为一个大小等于单个索引结构长度的空洞,因为它在目录项文件中还没有分配对应的目录项块。如果经过一段时间后图2(2)中标号为11的索引结构对应的块Blk2也满,则再次分裂,得到图2(3)所示的索引文件结构,此时在文件内部只有四个索引结构的值有效,并且Hash表中有三种不同的有效位数,比如第0号对应的块Blk0中存放的是Hash值形如xx0的,也就是010、100、110的目录项,这些目录项本该分别移入对应010、100、110所对应的块中,也就是图2(3)所示空白索引结构所对应的目录项块,但是,在此,为了提高系统的效率,采用延迟分裂的策略,只有在这些有效位较低的Hash值所指的目录项块被存满时,才一次性将各个目录项移到相应的块中,例如,假设标号为0所对应的Blk0已满,则将所有的低三位Hash值为100的目录项都移到标号为100的索引结构所对应的块中,因为此时索引结构为空,没有对应的块,则为它在目录项文件的末尾分配一块,并用该块的位置值初始化索引结构。此时global_depth变为3,而标号为11的块刚刚被分裂,其中的目录项有部分移到111号所对应的块中,因此11和111所对应的索引结构中的local_depth都为3,与global_depth相同。此时如果往附图2第3个图中增加一个hash值为110或者10的目录项,由于110和10对应的索引结构都为空,最后定位到序号为0所对应的索引结构上。

    关 键  词:
    一种 组织 访问 分布式 文件系统 目录 方法
      专利查询网所有文档均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    0条评论

    还可以输入200字符

    暂无评论,赶快抢占沙发吧。

    关于本文
    本文标题:一种组织和访问分布式文件系统目录的方法.pdf
    链接地址:https://www.zhuanlichaxun.net/p-638845.html
    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2017-2018 zhuanlichaxun.net网站版权所有
    经营许可证编号:粤ICP备2021068784号-1