CN107783988B - 一种目录树的加锁方法及设备 - Google Patents

一种目录树的加锁方法及设备 Download PDF

Info

Publication number
CN107783988B
CN107783988B CN201610727980.4A CN201610727980A CN107783988B CN 107783988 B CN107783988 B CN 107783988B CN 201610727980 A CN201610727980 A CN 201610727980A CN 107783988 B CN107783988 B CN 107783988B
Authority
CN
China
Prior art keywords
path
layer
node
lock
current
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN201610727980.4A
Other languages
English (en)
Other versions
CN107783988A (zh
Inventor
黄硕
陆靖
姚文辉
朱家稷
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Alibaba Group Holding Ltd
Original Assignee
Alibaba Group Holding Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Alibaba Group Holding Ltd filed Critical Alibaba Group Holding Ltd
Priority to CN201610727980.4A priority Critical patent/CN107783988B/zh
Publication of CN107783988A publication Critical patent/CN107783988A/zh
Application granted granted Critical
Publication of CN107783988B publication Critical patent/CN107783988B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/10File systems; File servers
    • G06F16/18File system types
    • G06F16/185Hierarchical storage management [HSM] systems, e.g. file migration or policies thereof

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Data Mining & Analysis (AREA)
  • Databases & Information Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
  • Storage Device Security (AREA)

Abstract

本申请的目的是提供一种目录树的加锁方法及设备,本申请通过预先分配对应于目录树各层结点的读写锁对象,能够避免动态创建和回收读写锁对象的内存管理开销,从而减少内存管理开销,以提高目录树操作性能;根据目录树操作,对操作路径中的各结点所对应的读写锁对象加读锁或写锁,以实现对所述操作路径的加锁粒度小的情况下,保证所述目录树操作并发访问时不会出现死锁情况,进而通过减少锁冲突来降低目录树并发操作的延迟,提高处理目录树操作的吞吐量。

Description

一种目录树的加锁方法及设备
技术领域
本申请涉及计算机领域,尤其涉及一种目录树的加锁方法及设备。
背景技术
在大规模分布式文件系统中,元数据服务器中目录树的并发访问性能,对于满足上层应用高并发低延迟的访问需求具有重要意义。其中,“目录树”是文件系统元数据的一种树形组织方式,例如/a/b/c,/a/d/,/a/c/这三个文件和目录的路径就形成了一个目录树。“目录(directory)”是目录树中的中间结点,例如根目录“/”、目录“a/”、目录“d/”;“文件(file)”是目录树中的叶子结点,例如文件/a/b/c;从根目录到一个文件或者从根目录到一个目录所经过的所有结点,形成了一个“路径”,例如“/a/b/c”。大规模分布式文件系统中,目录树通常以全内存数据结构的形式存在,可以包含数亿个文件和目录。所述分布式文件系统支持用户对目录树进行查找(Find、Exist)、列出(List Directory)、创建(CreateFile、Create Directory)、删除(Delete File、Delete Directory)、重命名(Rename File、Rename Directory)、硬链接(Hardlink File,即创建一个新文件指向一个已有文件的数据)等操作。上层应用会高并发的发起进行各种目录树操作,所述分布式文件系统一方面需要对目录树的数据结构进行合理加锁来保证数据的一致性和并发正确性,另一方面需要保证操作低延迟高并发的完成以满足性能需求。
目录树的并发访问加锁方法是提高目录树并发访问性能的关键技术。现有技术中通常采用以下两种目录树加锁方法:主要有两种:
方法一:使用单个读写锁(ReadWrite Lock)对整个目录树结构进行加锁保护。在读取、列出等只读操作中拿读锁,在创建、重命名等修改操作中拿写锁。拿读锁的操作间可以并行执行,但是要等待已有的拿写锁的操作先执行完毕;拿写锁的操作需要等待已有的其他读锁和写锁完成后才能执行。但由于该方法对整个目录树进行加锁,导致加锁的粒度较大(整个目录树),使得读写操作间锁冲突的概率增大,性能有限;又由于所有操作只使用一个读写锁,该读写锁在处理同时等待的读锁和写锁请求时一般使用“写锁优先”或者“读锁优先”模式,在大压力时这分别可能造成整棵树上的读操作或者写操作的长时间锁等待,难以达到低延迟高吞吐的目的。
方法二:对目录树操作所涉及的操作路径中的各个结点分别加读写锁。具体的操作包括:(1)在读取操作(例如,文件存在性判断)中对操作路径中的每个结点依次加读锁;(2)在修改操作(例如,创建文件)中,对从根目录到操作对象对应的操作路径的父目录的每个结点依次加读锁,对操作对象本身加写锁;(3)在重命名等涉及到源路径和目的路径的两个路径的目录树操作中,逐层对源路径和目的路径的每层中的读写锁对象加锁,其中,每层中按照结点名称的字典顺序加锁,锁的类型与上述步骤(2)中所加锁一致。在该方法二中,每次使用读写锁对象时按需创建读写锁对象,用完后将该创建的读写锁对象释放;例如,查找/a/b/f1文件时,分别对路径中的目录/、/a/、/a/b/、文件/a/b/f1加读锁;创建/a/b/f2文件时,对目录/、/a/、/a/b/加读锁,对/a/b/f2加写锁;重命名/a/b/f3到/a/d/f4时,依次对目录/、/a/、/a/b/、/a/d/加读锁,然后对/a/b/f3和/a/d/f4加写锁。由于该方法二只对目录树操作所涉及的操作路径中的各个结点分别加读写锁,使得该方法二的加锁的粒度较小,相比上述方法一能够明显减少并发锁冲突,提升分布式文件系统的性能。
但是,该方法二无法实现对重命名目录(Rename Directory)操作的高效加锁。该方法二在对重命名目录操作时,按照Key-Value(锁-值)的形式来存储目录树,整个路径为Key,对应的文件为Value,其中,该方法二的加锁方式依赖于Key-Value存储方式所带来的“每个目录结点不使用独立的数据结构”的特点,否则创建文件时必须对将创建文件的父目录加写锁来保证父目录的独立数据结构不被并发改写。但由于该方法二的这种Key-Value组织形式,将一个目录信息冗余到了多个包含它的路径中,使得Rename Directory时可能需要修改大量Key,影响整个分布式文件系统的性能;例如,重命名目录/a/b/到/a/d/时,需要修改所有的以/a/为前缀的目录下的路径key。该方法二读写锁对象内存管理开销大,由于该方法二每次使用读写锁对象时按需创建读写锁对象,用完后又需将该创建的读写锁对象释放,其中,目录树中的结点可能数亿个,读写锁对象数量多且会频繁的创建与释放,导致出现较大的内存管理开销。
因此,现有技术中通过使用单个读写锁(ReadWrite Lock)对整个目录树结构进行加锁保护,导致加锁的粒度较大且锁冲突增大,通过对目录树操作所涉及的操作路径中的各个结点分别加读写锁导致读写锁对象的内存管理开销大,且无法高效实现RenameDirectory操作。
申请内容
本申请的一个目的是提供一种目录树的加锁方法及设备,解决上述现有技术的加锁方式导致的加锁的粒度较大和读写锁对象的内存管理开销大的问题。
根据本申请的一个方面,提供了一种目录树的加锁方法,该方法包括:
预先分配对应于目录树各层结点的读写锁对象;
根据目录树操作,对操作路径中的各结点所对应的读写锁对象加读锁或写锁。
进一步地,上述方法中,所述预先分配对应于目录树各层结点的读写锁对象,包括:
对于目录树的每一层,预先分配好固定数量个读写锁对象并放置于顺序锁表中,其中,所述顺序锁表中每一个读写锁对象对应于唯一对象下标,所述对象下标值的范围为[0,固定数量-1];
将所有层的顺序锁表,按照层下标汇总到层顺序表中。
进一步地,上述方法中,当所述目录树操作为单路径读取时,根据目录树操作,对操作路径中的各结点所对应的读写锁对象加读锁或写锁,包括:
步骤一一、从所述操作路径的根结点开始,将所述根结点对应的当前层的层值设置为0,所述操作路径为被读取对象的父路径;
步骤一二、计算所述操作路径的当前层的当前结点的名称的哈希值,根据当前层下标在层顺序表中查找到的对应的当前层顺序锁表,在所述当前层顺序锁表中对下标为所述哈希值的读写锁对象加读锁,所述哈希值的范围为[0,固定数量-1];
步骤一三、判断所述当前结点是否为所述操作路径中的最后一个结点,
若是,则对所述操作路径加锁成功。
进一步地,上述方法中,所述步骤一三,判断所述当前结点是否为所述操作路径中的最后一个结点之后,还包括:
若否,则在所述当前结点的子结点列表中,按照当前结点的下一层目录的名称,查找对应的子结点,若未找到,则所述目录树读取操作失败,若找到,则将当前层的层值加1后转到步骤一二。
进一步地,上述方法中,所述单路径读取包括目录存在性判断、文件存在性判断目录存在性判断、文件存在性判断、列出目录的子结点、获取文件信息和获取目录信息中的任一种。
进一步地,上述方法中,当所述目录树操作为单路径删除时,根据目录树操作,对操作路径中的各结点所对应的读写锁对象加读锁或写锁,包括:
步骤二一、从所述操作路径的根结点开始,将所述根结点对应的当前层的层值设置为0,所述操作路径为被删除对象的父路径;
步骤二二、计算所述操作路径的当前层的当前结点的名称的哈希值,所述哈希值的范围为[0,固定数量-1];
步骤二三、根据当前层下标在层顺序表中查找到的对应的当前层顺序锁表,在所述当前层顺序锁表中查找下标为所述哈希值的读写锁对象,判断所述当前结点是否为所述操作路径中的最后一个结点,
若是,则对下标为所述哈希值的读写锁对象加写锁。
进一步地,上述方法中,所述步骤二三中的判断所述当前结点是否为所述操作路径中的最后一个结点之后,还包括:
若否,则对下标为所述哈希值的读写锁对象加读锁,并在所述当前结点的子结点列表中,按照当前结点的下一层目录的名称,查找对应的子结点,若未找到,则所述目录树删除操作失败,若找到,则将当前层的层值加1后转到步骤二二。
进一步地,上述方法中,所述单路径删除包括删除目录或删除文件。
进一步地,上述方法中,当所述目录树操作为单路径创建时,根据目录树操作,对操作路径中的各结点所对应的读写锁对象加读锁或写锁,包括:
步骤三一、从所述操作路径的根结点开始,将所述根结点对应的所述目录树的当前层的层值设置为0,所述操作路径为被创建对象的父路径,并预置待加锁类型为读锁;
步骤三二、计算所述操作路径的当前层的当前结点的名称的哈希值,所述哈希值的范围为[0,固定数量-1];
步骤三三、根据当前层下标在层顺序表中查找到的对应的当前层顺序锁表,在所述当前层顺序锁表中查找下标为所述哈希值的读写锁对象,判断所述当前结点是否为所述操作路径中的最后一个结点,
若是,则将下标为所述哈希值的读写锁对象加写锁。
进一步地,上述方法中,所述步骤三三中的判断所述当前结点是否为所述操作路径中的最后一个结点之后,还包括:
若否,则将下标为所述哈希值的读写锁对象加所述待加锁类型对应的锁,同时若所述下标为所述哈希值的读写锁对象加所述待加锁类型不是写锁,则在所述当前结点的子结点列表中,按照当前结点的下一层目录的名称,查找对应的子结点,若未找到,则将待加锁类型由读锁修改为写锁后,重新执行步骤三三。
进一步地,上述方法中,所述按照当前结点的下一层目录的名称,查找对应的子结点之后,还包括:
若找到,则将当前层的层值加1后转到步骤三二。
进一步地,上述方法中,所述单路径创建包括创建目录或文件。
进一步地,上述方法中,当所述目录树操作为双路径访问时,根据目录树操作,对操作路径中的各结点所对应的读写锁对象加读锁或写锁,包括:
步骤四一、从所述操作路径的根结点开始,将所述根结点对应的当前层的层值设置为0,所述操作路径包括源路径和目的路径,并设置所述源路径和所述目的路径的待加锁类型为无锁,其中,所述源路径为源访问对象的父路径,所述目的路径为目标访问对象的父路径;
步骤四二、计算所述源路径与所述目的路径的公共路径;
步骤四三、计算所述源路径的当前层的当前结点的名称的源端哈希值,计算所述目的路径的当前层的当前结点的名称的目的端哈希值,修改所述源路径的待加锁类型,根据所述公共路径修改目的路径的待加锁类型;
步骤四七、分别根据源路径和目标路径的当前层下标在层顺序表中查找到的对应的源路径和目标路径的当前层顺序锁表,分别在所述源路径和目标路径的当前层顺序锁表中查找下标为所述源端哈希值和目的端哈希值的读写锁对象,根据源路径和目的路径的待加锁类型,依次对所述下标为所述源端哈希值和目的端哈希值的读写锁对象加锁;
步骤四八、若所述源端哈希值存在,则在所述源路径的当前结点的子结点列表中,按照当前结点的下一层目录的名称,查找对应的子结点,若未找到,则所述源路径不存在。
进一步地,上述方法中,所述步骤四八、若所述源端哈希值存在,则在所述源路径的当前结点的子结点列表中,按照当前结点的下一层目录的名称,查找对应的子结点之后,还包括:
若找到,则执行步骤四九;
步骤四九、若所述目的端哈希值存在,则在所述目的径的当前结点的子结点列表中,按照当前结点的下一层目录的名称,查找对应的子结点,若找到,则将当前层的层值加1后转到步骤四三。
进一步地,上述方法中,步骤四九、若所述目的端哈希值存在,则在所述目的径的当前结点的子结点列表中,按照当前结点的下一层目录的名称,查找对应的子结点之后,还包括:
若未找到,则释放所述源路径和目的路径的当前层的已加锁,并将所述目的路径的待加锁类型设置为写锁后执行所述步骤四七。
进一步地,上述方法中,所述步骤四三、计算所述源路径的当前层的当前结点的名称的源端哈希值,计算所述目的路径的当前层的当前结点的名称的目的端哈希值,修改所述源路径的待加锁类型,根据所述公共路径修改目的路径的待加锁类型,包括:
若源路径的当前层在所述源路径的总层数内,则计算所述源路径的当前层的当前结点的名称的源端哈希值,所述源端哈希值的范围为[0,固定数量-1],否则,所述源端哈希值不存在。
进一步地,上述方法中,所述步骤四三、计算所述源路径的当前层的当前结点的名称的源端哈希值,计算所述目的路径的当前层的当前结点的名称的目的端哈希值,修改所述源路径的待加锁类型,根据所述公共路径修改目的路径的待加锁类型,包括:
若目的路径的当前层在所述目的路径的总层数内,则计算所述目的路径的当前层的当前结点的名称的目的端哈希值,所述目的端哈希值的范围为[0,固定数量-1],否则,所述目的端哈希值不存在。
进一步地,上述方法中,所述步骤四三、计算所述源路径的当前层的当前结点的名称的源端哈希值,计算所述目的路径的当前层的当前结点的名称的目的端哈希值,修改所述源路径的待加锁类型,根据所述公共路径修改目的路径的待加锁类型,包括:
若所述源路径的当前结点是所述源路径中的最后一个结点,则将所述源路径的待加锁类型设置为预置锁类型,否则,将所述源路径的待加锁类型设置为读锁;
进一步地,上述方法中,所述步骤四三、计算所述源路径的当前层的当前结点的名称的源端哈希值,计算所述目的路径的当前层的当前结点的名称的目的端哈希值,修改所述源路径的待加锁类型,根据所述公共路径修改目的路径的待加锁类型,包括:
若所述源路径的待加锁类型为写锁,且所述目的路径的当前层的当前结点在所述公共路径中,则将所述目的路径的待加锁类型设置为无锁,否则,判断所述目的路径的当前层的当前结点是否为所述目的路径的最后一个结点,若是,则将所述目的路径的待加锁类型设置为写锁;若否,则将所述目的路径的待加锁类型设置为读锁。
进一步地,上述方法中,所述步骤四七中的根据源路径和目的路径的待加锁类型,依次对所述下标为所述源端哈希值和目的端哈希值的读写锁对象加锁,包括:
若所述源端哈希值和所述目的端哈希值均不存在,则对所述源路径的当前层的当前结点和目的路径的当前层的当前结点对应的读写锁对象不加锁。
进一步地,上述方法中,所述根据源路径和目的路径的待加锁类型,依次对所述下标为所述源端哈希值和目的端哈希值的读写锁对象加锁,包括:
若所述源端哈希值和所述目的端哈希值均存在且不相同,则基于所述源端哈希值和目的端哈希值的大小按预设顺序,对所述层顺序表的当前层的锁顺序表中,下标为所述源端哈希值和目的端哈希值的读写锁对象分别加所述源路径和目的路径的待加锁类型的锁。
进一步地,上述方法中,所述根据源路径和目的路径的待加锁类型,依次对所述下标为所述源端哈希值和目的端哈希值的读写锁对象加锁,包括:
若所述源端哈希值和目的端哈希值均存在且相同,则判断源路径的待加锁类型和目的路径的待加锁类型的其中之一是否是写锁,若是,则将下标为所述源端哈希值和目的端哈希值的读写锁对象加写锁。
进一步地,上述方法中,若所述源端哈希值和目的端哈希值均存在且相同,则判断源路径的待加锁类型和目的路径的待加锁类型的其中之一是否是写锁之后,还包括:
若否,则将下标为所述源端哈希值和目的端哈希值的读写锁对象加读锁。
进一步地,上述方法中,所述双路径访问包括文件、目录重命名或文件链接。
根据本申请的另一方面,还提供了一种目录树的加锁设备,该设备包括:
预置装置,用于预先分配对应于目录树各层结点的读写锁对象;
加锁装置,用于根据目录树操作,对操作路径中的各结点所对应的读写锁对象加读锁或写锁。
进一步地,上述设备中,所述预置装置用于:
对于目录树的每一层,预先分配好固定数量个读写锁对象并放置于顺序锁表中,其中,所述顺序锁表中每一个读写锁对象对应于唯一对象下标,所述对象下标值的范围为[0,固定数量-1];
将所有层的顺序锁表,按照层下标汇总到层顺序表中。
进一步地,上述设备中,当所述目录树操作为单路径读取时,所述加锁装置包括:
一一单元,用于从所述操作路径的根结点开始,将所述根结点对应的当前层的层值设置为0,所述操作路径为被读取对象的父路径;
一二单元,用于计算所述操作路径的当前层的当前结点的名称的哈希值,根据当前层下标在层顺序表中查找到的对应的当前层顺序锁表,在所述当前层顺序锁表中对下标为所述哈希值的读写锁对象加读锁,所述哈希值的范围为[0,固定数量-1];
一三单元,用于判断所述当前结点是否为所述操作路径中的最后一个结点,若是,则对所述操作路径加锁成功。
进一步地,上述设备中,当所述目录树操作为单路径读取时,所述一三单元还用于:
若否,则在所述当前结点的子结点列表中,按照当前结点的下一层目录的名称,查找对应的子结点,若未找到,则所述目录树读取操作失败,若找到,则将当前层的层值加1后转到所述一二单元的执行逻辑中。
进一步地,上述设备中,所述单路径读取包括目录存在性判断、文件存在性判断、列出目录的子结点、获取文件信息和获取目录信息中的任一种。
进一步地,上述设备中,当所述目录树操作为单路径删除时,所述加锁装置包括:
二一单元,用于从所述操作路径的根结点开始,将所述根结点对应的当前层的层值设置为0,所述操作路径为被删除对象的父路径;
二二单元,用于计算所述操作路径的当前层的当前结点的名称的哈希值,所述哈希值的范围为[0,固定数量-1];
二三单元,用于根据当前层下标在层顺序表中查找到的对应的当前层顺序锁表,在所述当前层顺序锁表中查找下标为所述哈希值的读写锁对象,判断所述当前结点是否为所述操作路径中的最后一个结点,若是,则对下标为所述哈希值的读写锁对象加写锁。
进一步地,上述设备中,当所述目录树操作为单路径删除时,所述二三单元还用于:
若否,则对下标为所述哈希值的读写锁对象加读锁,并在所述当前结点的子结点列表中,按照当前结点的下一层目录的名称,查找对应的子结点,若未找到,则所述目录树删除操作失败,若找到,则将当前层的层值加1后转到所述二二单元的执行逻辑中。
进一步地,上述设备中,所述单路径删除包括删除目录或删除文件。
进一步地,上述设备中,当所述目录树操作为单路径创建时,所述加锁装置包括:
三一单元,用于从所述操作路径的根结点开始,将所述根结点对应的所述目录树的当前层的层值设置为0,所述操作路径为被创建对象的父路径,并预置待加锁类型为读锁;
三二单元,用于计算所述操作路径的当前层的当前结点的名称的哈希值,所述哈希值的范围为[0,固定数量-1];
三三单元,用于根据当前层下标在层顺序表中查找到的对应的当前层顺序锁表,在所述当前层顺序锁表中查找下标为所述哈希值的读写锁对象,判断所述当前结点是否为所述操作路径中的最后一个结点,若是,则将下标为所述哈希值的读写锁对象加写锁。
进一步地,上述设备中,当所述目录树操作为单路径创建时,所述三三单元还用于:
若否,则将下标为所述哈希值的读写锁对象加所述待加锁类型对应的锁,同时若所述下标为所述哈希值的读写锁对象加所述待加锁类型不是写锁,则在所述当前结点的子结点列表中,按照当前结点的下一层目录的名称,查找对应的子结点,若未找到,则将待加锁类型由读锁修改为写锁后,重新执行所述三三单元的执行逻辑。
进一步地,上述设备中,当所述目录树操作为单路径创建时,所述三三单元还用于:
若找到,则将当前层的层值加1后转到所述三二单元的执行逻辑中。
进一步地,上述设备中,所述单路径创建包括创建目录或文件。
进一步地,上述设备中,当所述目录树操作为双路径访问时,所述加锁装置包括:
四一单元,用于从所述操作路径的根结点开始,将所述根结点对应的当前层的层值设置为0,所述操作路径包括源路径和目的路径,并设置所述源路径和所述目的路径的待加锁类型为无锁,其中,所述源路径为源访问对象的父路径,所述目的路径为目标访问对象的父路径;
四二单元,用于计算所述源路径与所述目的路径的公共路径;
四三单元,用于计算所述源路径的当前层的当前结点的名称的源端哈希值,计算所述目的路径的当前层的当前结点的名称的目的端哈希值,修改所述源路径的待加锁类型,根据所述公共路径修改目的路径的待加锁类型;
四七单元,用于分别根据源路径和目标路径的当前层下标在层顺序表中查找到的对应的源路径和目标路径的当前层顺序锁表,分别在所述源路径和目标路径的当前层顺序锁表中查找下标为所述源端哈希值和目的端哈希值的读写锁对象,根据源路径和目的路径的待加锁类型,依次对所述下标为所述源端哈希值和目的端哈希值的读写锁对象加锁;
四八单元,用于若所述源端哈希值存在,则在所述源路径的当前结点的子结点列表中,按照当前结点的下一层目录的名称,查找对应的子结点,若未找到,则所述源路径不存在。
进一步地,上述设备中,当所述目录树操作为双路径访问时,所述四八单元还用于:
若找到,则转到四九单元的执行逻辑中;
四九单元,用于若所述目的端哈希值存在,则在所述目的径的当前结点的子结点列表中,按照当前结点的下一层目录的名称,查找对应的子结点,若找到,则将当前层的层值加1后转到所述四三单元的执行逻辑中。
进一步地,上述设备中,当所述目录树操作为双路径访问时,所述四八单元还用于:
若未找到,则释放所述源路径和目的路径的当前层的已加锁,并将所述目的路径的待加锁类型设置为写锁后执行所述四七单元的执行逻辑。
进一步地,上述设备中,所述四三单元用于:
若源路径的当前层在所述源路径的总层数内,则计算所述源路径的当前层的当前结点的名称的源端哈希值,所述源端哈希值的范围为[0,固定数量-1];否则,所述源端哈希值不存在。
进一步地,上述设备中,所述四三单元用于:
若目的路径的当前层在所述目的路径的总层数内,则计算所述目的路径的当前层的当前结点的名称的目的端哈希值,所述目的端哈希值的范围为[0,固定数量-1];否则,所述目的端哈希值不存在。
进一步地,上述设备中,所述四三单元用于:
若所述源路径的当前结点是所述源路径中的最后一个结点,则将所述源路径的待加锁类型设置为预置锁类型,否则,将所述源路径的待加锁类型设置为读锁。
进一步地,上述设备中,所述四三单元用于:
若所述源路径的待加锁类型为写锁,且所述目的路径的当前层的当前结点在所述公共路径中,则将所述目的路径的待加锁类型设置为无锁,否则,判断所述目的路径的当前层的当前结点是否为所述目的路径的最后一个结点:若是,则将所述目的路径的待加锁类型设置为写锁;若否,则将所述目的路径的待加锁类型设置为读锁。
进一步地,上述设备中,所述四四单元用于:
若所述源端哈希值和所述目的端哈希值均不存在,则对所述源路径的当前层的当前结点和目的路径的当前层的当前结点对应的读写锁对象不加锁。
进一步地,上述设备中,所述四四单元用于:
若所述源端哈希值和所述目的端哈希值均存在且不相同,则基于所述源端哈希值和目的端哈希值的大小按预设顺序,对所述层顺序表的当前层的锁顺序表中,下标为所述源端哈希值和目的端哈希值的读写锁对象分别加所述源路径和目的路径的待加锁类型的锁。
进一步地,上述设备中,所述四四单元用于:
若所述源端哈希值和目的端哈希值均存在且相同,则判断源路径的待加锁类型和目的路径的待加锁类型的其中之一是否是写锁,
若是,则将下标为所述源端哈希值和目的端哈希值的读写锁对象加写锁。
进一步地,上述设备中,所述四四单元用于:
若否,则将下标为所述源端哈希值和目的端哈希值的读写锁对象加读锁。
进一步地,上述设备中,所述双路径访问包括文件、目录重命名或文件链接。
根据本申请的另一面,还提供一种基于计算的设备,包括:
处理器;以及
被安排成存储计算机可执行指令的存储器,所述可执行指令在被执行时使所述处理器:
预先分配对应于目录树各层结点的读写锁对象;
根据目录树操作,对操作路径中的各结点所对应的读写锁对象加读锁或写锁。
与现有技术相比,本申请通过预先分配对应于目录树各层结点的读写锁对象,能够避免动态创建和回收读写锁对象的内存管理开销,从而减少内存管理开销,以提高目录树操作性能;根据目录树操作,对操作路径中的各结点所对应的读写锁对象加读锁或写锁,以实现对所述操作路径的加锁粒度小的情况下,保证所述目录树操作并发访问时不会出现死锁情况,进而通过减少锁冲突来降低目录树并发操作的延迟,提高处理目录树操作的吞吐量,进一步地,在所述目录树操作为双路径访问时,按本申请的方法进行加锁后,可以安全地直接改动源端的源路径和目的端的目的路径的两个结点内存数据结构来实现RenameDirectory(重命名),从而高效地实现Rename Directory(重命名)操作。进一步的,本申请通过预先分配对应于目录树各层结点的读写锁对象,包括:对于目录树的每一层,预先分配好固定数量个读写锁对象并放置于顺序锁表中,其中,所述顺序锁表中每一个读写锁对象对应于唯一对象下标,所述对象下标值的范围为[0,固定数量-1];将所有层的顺序锁表,按照层下标汇总到层顺序表中,以实现通过两次访问层顺序表和顺序锁表的下标值能够直接获取唯一对应的预先分配好的读写锁对象,够避免动态创建和回收读写锁对象的内存管理开销,从而减少内存管理开销,以提高目录树操作性能。
附图说明
通过阅读参照以下附图所作的对非限制性实施例所作的详细描述,本申请的其它特征、目的和优点将会变得更明显:
图1示出根据本申请一个方面的当所述目录树操作为单路径读取时的一种目录树的加锁方法的流程图;
图2示出根据本申请一个方面的当所述目录树操作为单路径删除时的一种目录树的加锁方法的流程图;
图3示出根据本申请一个方面的当所述目录树操作为单路径创建时的一种目录树的加锁方法的流程图;
图4示出根据本申请一个方面的当所述目录树操作为双路径访问时的一种目录树的加锁方法的流程图。
附图中相同或相似的附图标记代表相同或相似的部件。
具体实施方式
下面结合附图对本申请作进一步详细描述。
在本申请一个典型的配置中,终端、服务网络的设备和可信方均包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flashRAM)。内存是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括非暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
本申请提供一种目录树的加锁方法,其中,所述方法包括:
步骤S11,预先分配对应于目录树各层结点的读写锁对象;例如,目录树包括10层,预先对目录树这10层的各层结点分配对应的读写锁对象,例如,预先分配给目录树第一层结点的读写锁对象为120个,预先分配给目录树第二层结点的读写锁对象为200个,……,预先分配给目录树第10层结点的读写锁对象为345个。
步骤S12,根据目录树操作,对操作路径中的各结点所对应的读写锁对象加读锁或写锁。例如,需要访问文件/a/b/f1时,则依次对操作路径/a/b/中的结点“/”、“a/”、“b/”加读锁,以实现访问文件“f1”的目的。
在此,本申请提供的目录树的加锁方法中的所述目录树中的结点由一个内存数据结构表示,所述内存数据结构中包括目录树的当前结点的名称、子结点数量及子结点的指针列表等信息。为了保证所述内存数据结构不被多个目录树操作同时修改或者一边修改一边读,使用读写锁对结点进行并发访问保护。在目录树操作中必须先拿到相应结点的读锁或者写锁,才能访问该相应结点对应的内存数据结构的内容。本实施例通过预先分配对应于目录树各层结点的读写锁对象,能够避免动态创建和回收读写锁对象的内存管理开销,从而减少内存管理开销,以提高目录树操作性能;根据目录树操作,对操作路径中的各结点所对应的读写锁对象加读锁或写锁,以实现对所述操作路径的加锁粒度小的情况下,保证所述目录树操作并发访问时不会出现死锁情况,进而通过减少锁冲突来降低目录树并发操作的延迟,提高处理目录树操作的吞吐量。
在本申请的目录树的加锁方法一优选的实施例中,所述步骤S11预先分配对应于目录树各层结点的读写锁对象,包括:
步骤S111,对于目录树的每一层,预先分配好固定数量个读写锁对象并放置于顺序锁表中,其中,所述顺序锁表中每一个读写锁对象对应于唯一对象下标,所述对象下标的范围为[0,固定数量-1];例如,对目录树的每一层,预先分配好固定数量MAXLOCKS个读写锁(ReadWrite Lock)对象,放置在一个长度为MAXLOCKS的顺序表(即数组)ONE_LEVEL_LOCKS中,称为该层的“顺序锁表”,可以直接通过唯一的对象下标访问该顺序锁表中的读写锁对象;
步骤S112,将所有层的顺序锁表,按照层下标汇总到层顺序表中。例如,将所有层的顺序锁表,按照目录树的每一层的层下标汇总到一个长度为MAXLEVEL的层顺序表LEVEL_LOCKS_LIST中。因此,对于层顺序表未第X层的顺序锁表中的第Y个读写锁对象,可以通过层顺序表和顺序锁表的两次顺序表的下标来访问直接获取,即访问层顺序表LEVEL_LOCKS_LIST中的第X个顺序锁表X_LEVEL_LOCKS中的第Y个元素来获取对应的读写锁对象。
在本申请的一个优选实施例中,所述步骤S111中,对目录树的每一层预先分配的固定数量MAXLOCKS个读写锁对象,既可以是每层的固定数量MAXLOCKS个读写锁对象的数量固定且每一层的固定数量相同,也可以是每一层的固定数量MAXLOCKS个读写锁对象的数量固定但每一层的固定数量不同,为了减少目录树操作过程中的内存开销且在不影响目录树操作性能收益的情况下,在本申请的一个优选实施例中,优选将每一层的固定数量相同的固定数量MAXLOCKS个读写锁对象预先分配给目录树的每一层。例如,对目录树的每一层预先分配相同的固定数量的MAXLOCKS个读写锁对象:对目录树的第一层、第二层、第三层、……第n-1层及第n层均预先分配固定数量100(MAXLOCKS)个读写锁对象,以达到较少目录树操作过程中的内存开销的目的。
接着本申请的上述优选实施例,所述步骤S11中,首先按照目录树的每一层将目录树进行层划分,再对每一层预先分配固定数量相同的读写锁对象,并置于一个由顺序锁表和层顺序表组成的二维的顺序表中;在需要访问得到目录树中的层顺序表中的第X层的顺序锁表中的第Y个读写锁对象时,应通过访问层顺序表LEVEL_LOCKS_LIST中的第X个顺序锁表X_LEVEL_LOCKS中的第Y个元素,进而找到相应的读写锁对象,即第一次通过层下标找到目录树第X层的顺序锁表,第二次通过唯一的对象下标找到顺序锁表内的读写锁对象Y。在所述步骤S11中通过对目录树的每一层预先分配固定数量个读写锁对象,能够避免动态创建和回收读写锁对象的内存开销,从而节省该读写锁对象对应的内存管理开销,从而对系统性能有所提高。
在本申请的目录树的加锁方法一优选的实施例中,如图1所示,当所述目录树操作为单路径读取时,步骤S12,根据目录树操作,对操作路径中的各结点所对应的读写锁对象加读锁或写锁,包括:
步骤一一、从所述操作路径的根结点开始,将所述根结点对应的当前层的层值设置为0,所述操作路径为被读取对象的父路径;例如,从所述操作路径的根结点开始目录树的加锁流程,设置根结点对应的当前层的层值Level=0;
步骤一二、计算所述操作路径的当前层的当前结点的名称的哈希值,根据当前层下标在层顺序表中查找到的对应的当前层顺序锁表,在所述当前层顺序锁表中对下标为所述哈希值的读写锁对象加读锁,所述哈希值的范围为[0,固定数量-1];例如,计算操作路径的当前层Level的当前结点的名称的哈希值Hash,其中,所述哈希值范围为[0,固定数量MAXLOCKS-1],并根据当前层下标Level在层顺序表中找到对应的当前层Level的顺序锁表,并在当前层Level的顺序锁表中对下标为所述哈希值Hash的读写锁对象加读锁;在所述步骤一二中,通过哈希函数来计算每个结点对应的确定的哈希值(例如,根据结点的名称、结点的内存位置等来计算),然后该结点对应的读写锁对象即是目录树相应层的顺序锁表中下标为哈希值对应的读写锁对象;由于哈希函数的值域是有限的(0到固定数量-1)故能够用有限的读写锁对象服务不确定数量的结点。例如,目录树的当前层一共10个锁读写锁对象[0,9],结点的哈希值hash('a/')=1,hash('b/')=2,hash('c/')=1,那么对对‘b/’操作当前层的顺序锁表中的对象下标为2的读写锁对象加读锁,对‘a/’和‘c/’加锁时,就操作当前层的顺序锁表中的对象下标为1的读写锁对象加读锁,以实现部分结点共享同一个读锁对象,进而实现读锁的并发访问;
步骤一三、判断所述当前结点是否为所述操作路径中的最后一个结点,
若是,则对所述操作路径加锁成功;
若否,则在所述当前结点的子结点列表中,按照当前结点的下一层目录的名称,查找对应的子结点,若未找到,则所述目录树读取操作失败,若找到,则将当前层的层值加1后转到步骤一二。例如,判断操作路径的当前层Level的当前结点是否为所述操作路径中的最后一个结点,若是,则对所述操作路径加锁成功,加锁流程结束;若否,则在所述当前结点的子结点列表中,按照当前结点的下一层目录的名称Name,查找对应的子结点:(a)若未找到,则所述目录树读取操作失败,用于指示所述被读取对象的父路径对应的操作路径不存在(即路径不存在),加锁流程结束;例如,备读取对象不存在的情况如下:要访问被读取对象‘/a/b/c’时,但是‘b/’目录其实并不存在,不存在则返回错误码,结束加锁流程即可;(b)若查找到,则设置当前层的层值Level=Level+1,并返回所述步骤一二继续执行。
本申请的目录树的加锁方法一优选的实施例中,当所述目录树操作为单路径读取时,步骤S12中的所述单路径读取包括目录存在性判断、文件存在性判断、列出目录的子结点、获取文件信息和获取目录信息中的任一种。例如,所述单路径读取包括了:“目录存在性判断或文件存在性判断”(Exist)、“列出目录的子结点”(List Directory)、“获取文件信息或获取目录信息”(GetMeta)”等。
在此,在对多个目录树操作进行操作路径的加锁时,是对被读取对象的父目录采用上述步骤S12的加锁方式进行相应的加锁的。例如,当所述目录树操作为判断文件‘/a/b/c’的存在性时,会对路径“/a/b/”执行上述所述目录树操作为“单路径读取”时对应的步骤S12中的加锁方式进行加锁,依次对操作路径中的根结点‘/’、结点‘a/’、结点‘b/’加读锁,在b/的数据结构中,即可判断文件c的存在性。又例如,当所述目录树操作为列出目录/a/b/的子结点时,会对路径“/a/b/”执行上述所述目录树操作为“单路径读取”时对应的步骤S12中的加锁方式进行加锁,依次对根结点‘/、’结点‘a/’、结点‘b/’加读锁,在b/的数据结构中,即可获取所有子结点信息。
在本申请的目录树的加锁方法一优选的实施例中,如图2所示,当所述目录树操作为单路径删除时,步骤S12,根据目录树操作,对操作路径中的各结点所对应的读写锁对象加读锁或写锁,包括:
步骤二一、从所述操作路径的根结点开始,将所述根结点对应的当前层的层值设置为0,所述操作路径为被删除对象的父路径;例如,从所述操作路径的根结点开始目录树的加锁流程,设置根结点对应的当前层的层值Level=0;
步骤二二、计算所述操作路径的当前层的当前结点的名称的哈希值,所述哈希值的范围为[0,固定数量-1];例如,计算操作路径的当前层Level的当前结点的名称的哈希值Hash,其中,所述哈希值范围为[0,固定数量MAXLOCKS-1];
步骤二三、根据当前层下标在层顺序表中查找到的对应的当前层顺序锁表,在所述当前层顺序锁表中查找下标为所述哈希值的读写锁对象,判断所述当前结点是否为所述操作路径中的最后一个结点:
若是,则对下标为所述哈希值的读写锁对象加写锁;
若否,则对下标为所述哈希值的读写锁对象加读锁,并在所述当前结点的子结点列表中,按照当前结点的下一层目录的名称,查找对应的子结点:若未找到,则所述目录树删除操作失败;若找到,则将当前层的层值加1后转到步骤二二。例如,根据当前层下标Level在层顺序表中找到对应的当前层Level的顺序锁表,并在当前层Level的顺序锁表中对下标为所述哈希值Hash的读写锁对象加读锁,并判断操作路径的当前层Level的当前结点是否为所述操作路径中的最后一个结点,若是,则对下标为所述哈希值的读写锁对象加写锁,用于指示对所述操作路径加锁成功,加锁流程结束;若否,则对下标为所述哈希值的读写锁对象加读锁,并在所述当前结点的子结点列表中,按照当前结点的下一层目录的名称Name,查找对应的子结点:(a)若未找到,则所述目录树删除操作失败,用于指示所述被删除对象的父路径对应的操作路径不存在,加锁流程结束;(b)若查找到,则设置当前层的层值Level=Level+1,并返回所述步骤二二继续执行。
本申请的目录树的加锁方法一优选的实施例中,当所述目录树操作为单路径删除时,步骤S12中的所述单路径删除包括:删除目录或删除文件(Delete File/Directory)等。
在此,在对目录树操作进行操作路径的加锁时,是对被删除对象的父目录采用上述步骤S12的加锁方式进行相应的加锁。例如,(1)删除目录/a/b/c/时,对被删除目录的父路径‘/a/b/’执行上述所述目录树操作为“单路径删除”时对应的步骤S12中的加锁方式进行加锁,依次对对操作路径中的根结点‘/’、结点‘a/’加读锁,对‘b/’加写锁,在b/的数据结构中获取待删目录c/的信息,然后递归地删除c/及其所有子结点的数据结构;(2)删除文件/a/b/f时,对被删除文件的父路径‘/a/b/’执行上述所述目录树操作为“单路径删除”时对应的步骤S12中的加锁方式进行加锁,依次对根结点‘/’、结点‘a/’加读锁,对‘b/’加写锁,在b/的数据结构中获取待删文件f涉及的所有相关数据信息,然后删除待删文件f涉及的所有相关数据信息。
本申请的目录树的加锁方法一优选的实施例中,如图3所示,当所述目录树操作为单路径创建时,步骤S12,根据目录树操作,对操作路径中的各结点所对应的读写锁对象加读锁或写锁,包括:
步骤三一、从所述操作路径的根结点开始,将所述根结点对应的所述目录树的当前层的层值设置为0,所述操作路径为被创建对象的父路径,并预置待加锁类型;例如,从所述操作路径的根结点开始目录树的加锁流程,设置根结点对应的当前层的层值Level=0,并预置待加锁类型LOCK_TYPE=读锁以用于后续释放对应的锁后并重新加锁,以改变该待加锁类型;
步骤三二、计算所述操作路径的当前层的当前结点的名称的哈希值,所述哈希值的范围为[0,固定数量-1];例如,计算操作路径的当前层Level的当前结点的名称的哈希值Hash,其中,所述哈希值范围为[0,固定数量MAXLOCKS-1];
步骤三三、根据当前层下标在层顺序表中查找到的对应的当前层顺序锁表,在所述当前层顺序锁表中查找下标为所述哈希值的读写锁对象,判断所述当前结点是否为所述操作路径中的最后一个结点:
若是,则将下标为所述哈希值的读写锁对象加写锁;
若否,则将下标为所述哈希值的读写锁对象加所述待加锁类型对应的锁,同时若下标为所述哈希值的读写锁对象加所述待加锁类型不是写锁,则在所述当前结点的子结点列表中,按照当前结点的下一层目录的名称,查找对应的子结点:若未找到,则将待加锁类型由读锁修改为写锁后,重新执行步骤三三,若找到,则将当前层的层值加1后转到步骤三二。例如,根据当前层下标Level在层顺序表中找到对应的当前层Level的顺序锁表,并在当前层Level的顺序锁表中对下标为所述哈希值Hash的读写锁对象加读锁,并判断操作路径的当前层Level的当前结点是否为所述操作路径中的最后一个结点,若是,则对下标为所述哈希值Hash的读写锁对象加写锁,用于指示对所述操作路径加锁成功,加锁流程结束;若否,则下标为所述哈希值Hash的读写锁对象加所述待加锁类型LOCK_TYPE对应的锁,同时,判断所述哈希值Hash的读写锁对象加所述待加锁类型LOCK_TYPE对应的锁,若所述哈希值Hash的读写锁对象加所述待加锁类型LOCK_TYPE为写锁,则加锁流程结束,若所述哈希值Hash的读写锁对象加所述待加锁类型LOCK_TYPE为不是写锁,则继续在所述当前结点的子结点列表中,按照当前结点的下一层目录的名称Name,查找对应的子结点:(a)若未找到,则表示所述操作路径的后续路径不存在,需要释放掉当前层Level的当前结点的读锁并重新加与所述待加锁类型对应的锁,将待加锁类型LOCK_TYPE由读锁修改为写锁,即设置LOCK_TYPE=写锁后,重新执行所述步骤三三;(b)若查找到,则设置当前层的层值Level=Level+1,并返回所述步骤三二继续执行。
在上述优选实施例中,当所述目录树操作为单路径创建时,若中途找不到所述操作路径的当前结点的下一结点时,指示需要从操作路径的当前结点开始往后创建所述操作路径的当前结点后续对应的路径,因此在所述步骤三三中需要将当前结点已加的与所述待加锁类型LOCK_TYPE对应的锁释放并改变所述待加锁的类型,其中,待加锁类型LOCK_TYPE可以是写锁亦可以是读锁。例如,创建目录‘/a/b/c/’时,如果拿住‘a/’读锁发现‘b/’不存在,则指示需要创建‘a/’往后的内容,此时需要释放‘a/’已加的读锁,重新去拿‘a/’对应的写锁,然后创建‘b/c/’,并将‘b/c/’加入到‘a/’的子结点列表中。
本申请的目录树的加锁方法一优选的实施例中,当所述目录树操作为单路径创建时,步骤S12中的所述单路径创建包括:创建目录或创建文件(Create File/Directory)等。
在此,在对目录树操作进行操作路径的加锁时,是对被创建对象的父目录采用上述步骤S12的加锁方式进行相应的加锁。例如,在目录‘/a/b/’中创建文件‘/a/b/c/f’时,对被创建文件‘/a/b/c/f’执行上述所述目录树操作为“单路径创建”时对应的步骤S12中的加锁方式进行加锁,由于‘c/’不存在,依次对操作路径中的根结点‘/’、结点‘a/’加读锁,对‘b/’加写锁(‘b/’先加的读锁被释放掉),然后递归地在‘b/’的数据结构中创建相应的目录c/及其所包含的所有与文件f相关的所有数据信息。
本申请的目录树的加锁方法一优选的实施例中,如图4所示,当述目录树操作为双路径访问时,步骤S12,根据目录树操作,对操作路径中的各结点所对应的读写锁对象加读锁或写锁,包括:
步骤四一、从所述操作路径的根结点开始,将所述根结点对应的当前层的层值设置为0,所述操作路径包括源路径和目的路径,并设置所述源路径和所述目的路径的待加锁类型为无锁,其中,所述源路径为源访问对象的父路径,所述目的路径为目标访问对象的父路径;例如,从所述操作路径的根结点开始目录树的加锁流程,设置根结点对应的当前层的层值Level=0,并预置所述源路径的待加锁类型SRC_LOCK_TYPE=无锁,预置所述目的路径的待加锁类型DEST_LOCK_TYPE=无锁;
步骤四二、计算所述源路径与所述目的路径的公共路径,以减少重复加锁,因为公共路径里面的结点,对于所述源路径和所述目的路径来说,其实是同一个目录树中的结点,为了防止同一个读写锁对象对源路径和目的路径拿两遍,故计算源路径和目的路径的公共路径,以保证同一个目录树中的结点只拿一次,以减少不必要的重复拿锁,此处并不是减少加锁的锁粒度;例如,计算源路径SRC和目的路径DEST的公共路径COMMON,即,若源路径为‘/a/b/c/d/’,目的路径为‘/a/b/e/g/h’,则计算得到的源路径/a/b/c/d/’与目的路径/a/b/e/g/h’的公共路径为‘/a/b/’;
步骤四三、计算所述源路径的当前层的当前结点的名称的源端哈希值,计算所述目的路径的当前层的当前结点的名称的目的端哈希值,修改所述源路径的待加锁类型,根据所述公共路径修改目的路径的待加锁类型;例如,计算源路径的当前层Level的当前结点的名称的源端哈希值HashSRC,其中,所述源端哈希值范围为[0,固定数量MAXLOCKS-1],计算目的路径的当前层Level的当前结点的名称的目的端哈希值HashDEST,其中,所述目的端哈希值范围为[0,固定数量MAXLOCKS-1],接着判断该源路径的当前层Level是否为所述源路径的最后一个结点,以修改所述源端待加锁类型SRC_LOCK_TYPE对应的锁,并基于所述公共路径COMMON修改所述目的端待加锁类型DEST_LOCK_TYPE对应的锁;
步骤四七、分别根据源路径和目标路径的当前层下标在层顺序表中查找到的对应的源路径和目标路径的当前层顺序锁表,分别在所述源路径和目标路径的当前层顺序锁表中查找下标为所述源端哈希值和目的端哈希值的读写锁对象,根据源路径和目的路径的待加锁类型,依次对所述下标为所述源端哈希值和目的端哈希值的读写锁对象加锁;例如,根据源路径的当前层下标Level在层顺序表中找到对应的当前层Level的顺序锁表,并在当前层Level的顺序锁表中对下标为所述源端哈希值HashSRC的读写锁对象加锁,并根据所述源路径的待加锁类型SRC_LOCK_TYPE,依次对所述下标为所述源端哈希值HashSRC的读写锁对象加锁;并根据目的路径的当前层下标Level在层顺序表中找到对应的当前层Level的顺序锁表,并在当前层Level的顺序锁表中对下标为所述目的端哈希值HashDEST的读写锁对象加锁,并根据所述目的路径的待加锁类型DEST_LOCK_TYPE,依次对所述下标为所述目的端哈希值HashDEST的读写锁对象加锁;
步骤四八、若所述源端哈希值存在,则在所述源路径的当前结点的子结点列表中,按照当前结点的下一层目录的名称,查找对应的子结点:若未找到,则所述源路径不存在;若找到,则执行步骤四九。例如,如果源端哈希值HashSRC存在,则在所述源路径的当前结点的子结点列表中,按照当前结点的下一层目录的名称Name,查找对应的子结点:(a)若未找到,则表示所述源路径不存在,所述双路径访问对应的加锁流程结束;(b)若查找到,则继续执行所述步骤四九;
步骤四九、若所述目的端哈希值存在,则在所述目的径的当前结点的子结点列表中,按照当前结点的下一层目录的名称,查找对应的子结点:
若找到,则将当前层的层值加1后转到步骤四三;
若未找到,则释放所述源路径和目的路径的当前层的已加锁,并将所述目的路径的待加锁类型设置为写锁后执行所述步骤四七。例如,如果目的端哈希值HashDEST存在,则在所述目的路径的当前结点的子结点列表中,按照当前结点的下一层目录的名称Name,查找对应的子结点:(a)若查找到,则设置当前层的层值Level=Level+1后转至所述步骤S四三;(b)若未查找到,则表明目的路径中的后续路径不存在,需要创建新的子结点,然后记录到相应的当前结点的子结点列表中,故需释放掉所述源路径和所述目的路径的当前层Level已加的所有锁,并将所述目的路径的待加锁类型设置为写锁后,即设置DEST_LOCK_TYPE=写锁后继续执行所述步骤四七。
接着本申请的上述目录树的加锁方法一优选的实施例,所述步骤四三,包括:
若源路径的当前层在所述源路径的总层数内,则计算所述源路径的当前层的当前结点的名称的源端哈希值,所述源端哈希值的范围为[0,固定数量-1];否则,所述源端哈希值不存在。例如,如果所述源路径的当前层Level小于所述源路径SRC的总层数,计算所述源路径SRC的当前层Level的当前结点的名称的源端哈希值HashSRC,其中,所述源端哈希值HashSRC的范围为[0,MAXLOCKS-1];否则,说明所述源路径不需要进行加锁了,则标记该源端哈希值HashSRC为不存在,比如,将文件‘/a/b’重命名到目录‘/a/c/d/e/f/e/’,由于源路径的层数比目的路径的层数少,源路径加锁到‘a/’后面的层数就没有锁需要加了,故标记为源端哈希值HashSRC为不存在。
接着本申请的上述目录树的加锁方法一优选的实施例,所述步骤四三,包括:
若目的路径的当前层在所述目的路径的总层数内,则计算所述目的路径的当前层的当前结点的名称的目的端哈希值,所述目的端哈希值的范围为[0,固定数量-1];否则,所述目的端哈希值不存在。例如,如果所述目的路径的当前层Level小于所述目的路径DEST的总层数,计算所述目的路径DEST的当前层Level的当前结点的名称的目的端哈希值HashDEST,其中,所述目的端哈希值HashDEST的范围为[0,MAXLOCKS-1];否则,说明所述目的路径不需要进行加锁了,则标记该目的端哈希值HashDEST为不存在,由于源路径和目的路径的层数可以不一样,所以可能一端(源路径或目的路径)已经加完锁了,但是还要等另一端(源路径或目的路径)加完锁整个流程才结束,故此处对不需要进行加锁的目的路径的目的端哈希值HashDEST标记为不存在。
接着本申请的上述目录树的加锁方法一优选的实施例,所述步骤四三,包括:
若所述源路径的当前结点是所述源路径中的最后一个结点,则将所述源路径的待加锁类型设置为预置锁类型,否则,将所述源路径的待加锁类型设置为读锁。例如,判断所述源路径的当前层Level的当前结点是否为所述源路径中的最后一个结点,若是,则设置所述源端待加锁类型SRC_LOCK_TYPE设置为预置锁类型,其中,所述预置锁类型为SRC_END_LOCK_TYPE,进一步地,所述SRC_END_LOCK_TYPE为所述源路径的最后一个结点的锁类型,且所述源路径的最后一个结点对应的SRC_END_LOCK_TYPE的锁类型由流程发起者预先设定的;否则,将所述源路径的待加锁类型SRC_LOCK_TYPE设置为,即SRC_LOCK_TYPE=读锁。
接着本申请的上述目录树的加锁方法一优选的实施例,所述步骤四三,包括:
若所述源路径的待加锁类型为写锁,且所述目的路径的当前层的当前结点在所述公共路径中,则将所述目的路径的待加锁类型设置为无锁,否则,判断所述目的路径的当前层的当前结点是否为所述目的路径的最后一个结点,若是,则将所述目的路径的待加锁类型设置为写锁;若否,则将所述目的路径的待加锁类型设置为读锁。例如,所述源路径的待加锁类型SRC_LOCK_TYPE=写锁,且所述目的路径的当前层Level的当前结点在所述公共路径COMMON中,则设置所述目的路径的待加锁类型DEST_LOCK_TYPE=无锁,即不需要再对目录树中的公共路径中的当前结点对应的读写锁对象再加锁,以减少重复加锁;否则,判断所述目的路径的当前层Level的当前结点是否为所述目的路径中的最后一个结点,若是,则将所述目的路径的待加锁类型DEST_LOCK_TYPE设置为写锁,即DEST_LOCK_TYP=写锁,若否,则将所述目的路径的待加锁类型DEST_LOCK_TYPE设置为读锁,即DEST_LOCK_TYP=读锁。
接着本申请的上述目录树的加锁方法一优选的实施例,根据源路径和目的路径的待加锁类型,依次对所述下标为所述源端哈希值和目的端哈希值的读写锁对象加锁,包括:
若所述源端哈希值和所述目的端哈希值均不存在,则对所述源路径的当前层的当前结点和目的路径的当前层的当前结点对应的读写锁对象不加锁。例如,如果源端哈希值HashSRC或者目的端哈希值HashDEST不存在,则表明源路径或者所述目的路径已经加锁完毕,不需要再对所述源路径或所述目的路径再加锁;
接着本申请的上述目录树的加锁方法一优选的实施例,根据源路径和目的路径的待加锁类型,依次对所述下标为所述源端哈希值和目的端哈希值的读写锁对象加锁,包括:
若所述源端哈希值和所述目的端哈希值均存在且不相同,则基于所述源端哈希值和目的端哈希值的大小按预设顺序,对所述层顺序表的当前层的锁顺序表中,下标为所述源端哈希值和目的端哈希值的读写锁对象分别加所述源路径和目的路径的待加锁类型的锁。在此,所述预设顺序可以是从小到大的顺序,亦可以是从大到小的顺序,在本申请的实施例中不受限制,只要是按序对源路径和目的路径进行加锁以防止死锁情况发生,例如,若出现一个目录树操作先加了‘a/’写锁再去加‘b/’写锁,另外一个操作先加‘b/’写锁再去加‘a/’写锁,就会相互处于锁等待,导致死锁了,故需要按照目的端哈希值和源端哈希值的大小的预设顺序进行加锁,以防止死锁;例如,若所述源端哈希值HashSRC和所述目的端哈希值HashDEST均存在且不相同,分别根据所述源路径的当前层下标在层顺序表中查找到的对应的当前层顺序锁表,在所述当前层顺序锁表中查找下标为所述源端哈希值HashSRC的读写锁对象,并对所述源端哈希值的读写锁对象加所述源路径的待加锁类型SRC_LOCK_TYPE的锁;根据所述目的路径的当前层下标在层顺序表中查找到的对应的当前层顺序锁表,在所述当前层顺序锁表中查找下标为所述目的端哈希值HashDEST的读写锁对象,并对所述目的端哈希值的读写锁对象加所述目的路径的待加锁类型DEST_LOCK_TYPE的锁;
若所述源端哈希值和目的端哈希值均存在且相同,则判断源路径的待加锁类型和目的路径的待加锁类型的其中之一是否是写锁,若是,则将下标为所述源端哈希值和目的端哈希值的读写锁对象加写锁;若否,则将下标为所述源端哈希值和目的端哈希值的读写锁对象加读锁。例如,若所述源端哈希值HashSRC和所述目的端哈希值HashDEST均存在且相同,分别根据所述源路径的当前层下标在层顺序表中查找到的对应的当前层顺序锁表,在所述当前层顺序锁表中查找下标为所述源端哈希值HashSRC的读写锁对象,根据所述目的路径的当前层下标在层顺序表中查找到的对应的当前层顺序锁表,在所述当前层顺序锁表中查找下标为所述目的端哈希值HashDEST的读写锁对象,判断源路径的待加锁类型SRC_LOCK_TYPE和目的路径的待加锁类型DEST_LOCK_TYPE的其中之一是否是写锁,若是,则分别将下标为所述源端哈希值HashSRC和目的端哈希值HashDEST的读写锁对象加写锁;若否,则分别将下标为所述源端哈希值HashSRC和目的端哈希值HashDEST的读写锁对象加读锁。
本申请的目录树的加锁方法一优选的实施例中,当所述目录树操作为双路径访问时,步骤S12中的所述双路径访问包括文件、目录重命名(Rename File/Directory)或文件链接(Hardlink File)等。
在此,在“文件或目录重命名”(Rename File/Directory)操作中使用“双路径访问”加锁流程时,所述源路径SRC为被重命名的文件或目录的父目录,目的路径DEST为重命名目的文件或目录的父目录。同时,由于被重命名的文件或目录要被移走,因此设置预置锁类型SRC_END_LOCK_TYPE=“写锁”。
在此,在“文件链接”(Hardlink File)操作中使用“双路径访问”加锁流程时,所述源路径SRC为被链接文件的父目录,所述目的路径DEST为链接目标文件的父目录。同时,由于源路径对应的文件不需要被修改,因此设置预置锁类型SRC_END_LOCK_TYPE=“读锁”。
在此,若所述目录树操作为将源文件链接到目的文件时,是源文件的父目录和目的文件的父目录采用上述步骤S12的双路径访问对应的加锁方式进行相应的加锁;例如:(1)将源文件‘/a/b/f1’链接到目的‘/a/g/h/f2’时,SRC=‘/a/b/’且DEST=‘/a/g/h/’,依次对根结点‘/’、结点‘a/’加读锁,对结点‘b/’加读锁,对g/加读锁(其中,处于目录树中的同一层的‘b/’和‘g/’的加锁顺序取决于各自对应的哈希值大小),对‘h/’加写锁。若所述目录树操作为将源文件链接到目的文件时,是源文件的父目录和目的文件的父目录采用上述步骤S12的双路径访问对应的加锁方式进行相应的加锁;例如:(2)将源目录‘/a/b/c/d/e/’重命名到目的目‘/a/g/m/’时,SRC=‘/a/b/c/d/’且DEST=‘/a/g/’,依次对‘/’、‘a/’加读锁,对‘b/’加读锁,对‘g/’加写锁(其中,处于目录树中的同一层的‘b/’和‘g/’的加锁顺序取决于其哈希值大小),对‘c/’加读锁,对‘d/’加写锁。
需要说明的是,上述的所有目录树操作,在所述目录树操作完毕后,均释放掉其拿到的所有锁。
在本申请的上述优选实施例中,通过采用上述加锁流程的目录树操作并发执行时可以保证操作过程的安全性:由于对不同操作路径下对应的同一个结点进行加写锁时,其中有一个操作路径在对该结点加写锁时,后续其他操作路径则需要按照加写锁的先后顺序对该结点进行加写锁,以实现结点的数据结构不会被并发,同理按照对该结点的加读锁顺序或者加写锁顺序对该结点进行加锁,也能实现结点的数据结构不会被边改边读;通过采用上述加锁流程的目录树操作并发执行时可以保证操作过程的活性:不会产生死锁,因为对所有操作路径对应的结点加锁的顺序为先按照层次加锁,在层次内按照哈希值的大小来实现结点的相应加锁,其中在目录树操作为双路径访问时,源路径的当前结点对应的源端哈希值和目的路径的当前结点对应的目的端哈希值按照预设顺序对相应的读写锁对象,这个全局唯一顺序保证了各种操作并发访问时不会出现死锁情况;例如,死锁的一个例子是说有人拿住A锁再去拿B锁,另外有人拿住B锁再去拿A锁,这时都拿不到对方持有的锁,就死锁了,而本申请是将所有人都按照一个全局唯一顺序拿锁,就能够避免此种死锁情况,从而实现对各种目录树操作并发访问进行高效加锁。
根据本申请的另一面,还提供一种目录树的加锁设备,其中,所述设备1包括:
预置装置11,用于预先分配对应于目录树各层结点的读写锁对象;例如,目录树包括10层,预先对目录树这10层的各层结点分配对应的读写锁对象,例如,预先分配给目录树第一层结点的读写锁对象为120个,预先分配给目录树第二层结点的读写锁对象为200个,……,预先分配给目录树第10层结点的读写锁对象为345个。
加锁装置12用于,根据目录树操作,对操作路径中的各结点所对应的读写锁对象加读锁或写锁。例如,需要访问文件/a/b/f1时,则依次对操作路径/a/b/中的结点“/”、“a/”、“b/”加读锁,以实现访问文件“f1”的目的。
在此,本申请提供的目录树的加锁方法中的所述目录树中的结点由一个内存数据结构表示,所述内存数据结构中包括目录树的当前结点的名称、子结点数量及子结点的指针列表等信息。为了保证所述内存数据结构不被多个目录树操作同时修改或者一边修改一边读,使用读写锁对结点进行并发访问保护。在目录树操作中必须先拿到相应结点的读锁或者写锁,才能访问该相应结点对应的内存数据结构的内容。本实施例通过预先分配对应于目录树各层结点的读写锁对象,能够避免动态创建和回收读写锁对象的内存管理开销,从而减少内存管理开销,以提高目录树操作性能;根据目录树操作,对操作路径中的各结点所对应的读写锁对象加读锁或写锁,以实现对所述操作路径的加锁粒度小的情况下,保证所述目录树操作并发访问时不会出现死锁情况,进而通过减少锁冲突来降低目录树并发操作的延迟,提高处理目录树操作的吞吐量。
在本申请的目录树的加锁设备一优选的实施例中,所述预置装置用于:
一、对于目录树的每一层,预先分配好固定数量个读写锁对象并放置于顺序锁表中,其中,所述顺序锁表中每一个读写锁对象对应于唯一对象下标,所述对象下标的范围为[0,固定数量-1];例如,对目录树的每一层,预先分配好固定数量MAXLOCKS个读写锁(ReadWrite Lock)对象,放置在一个长度为MAXLOCKS的顺序表(即数组)ONE_LEVEL_LOCKS中,称为该层的“顺序锁表”,可以直接通过唯一的对象下标访问该顺序锁表中的读写锁对象;
二、将所有层的顺序锁表,按照层下标汇总到层顺序表中。例如,将所有层的顺序锁表,按照目录树的每一层的层下标汇总到一个长度为MAXLEVEL的层顺序表LEVEL_LOCKS_LIST中。因此,对于层顺序表未第X层的顺序锁表中的第Y个读写锁对象,可以通过层顺序表和顺序锁表的两次顺序表的下标来访问直接获取,即访问层顺序表LEVEL_LOCKS_LIST中的第X个顺序锁表X_LEVEL_LOCKS中的第Y个元素来获取对应的读写锁对象。
在本申请的一个优选实施例中,所述预置装置中,对目录树的每一层预先分配的固定数量MAXLOCKS个读写锁对象,既可以是每层的固定数量MAXLOCKS个读写锁对象的数量固定且每一层的固定数量相同,也可以是每一层的固定数量MAXLOCKS个读写锁对象的数量固定但每一层的固定数量不同,为了减少目录树操作过程中的内存开销且在不影响目录树操作性能收益的情况下,在本申请的一个优选实施例中,优选将每一层的固定数量相同的固定数量MAXLOCKS个读写锁对象预先分配给目录树的每一层。例如,对目录树的每一层预先分配相同的固定数量的MAXLOCKS个读写锁对象:对目录树的第一层、第二层、第三层、……第n-1层及第n层均预先分配固定数量100(MAXLOCKS)个读写锁对象,以达到较少目录树操作过程中的内存开销的目的;
接着本申请的上述优选实施例,所述预置装置11首先按照目录树的每一层将目录树进行层划分,再对每一层预先分配固定数量相同的读写锁对象,并置于一个由顺序锁表和层顺序表组成的二维的顺序表中;在需要访问得到目录树中的层顺序表中的第X层的顺序锁表中的第Y个读写锁对象时,应通过访问层顺序表LEVEL_LOCKS_LIST中的第X个顺序锁表X_LEVEL_LOCKS中的第Y个元素,进而找到相应的读写锁对象,即第一次通过层下标找到目录树第X层的顺序锁表,第二次通过唯一的对象下标找到顺序锁表内的读写锁对象Y。在所述预置装置11中通过对目录树的每一层预先分配固定数量个读写锁对象,能够避免动态创建和回收读写锁对象的内存开销,从而节省该读写锁对象对应的内存管理开销,从而对系统性能有所提高。
在本申请的目录树的加锁设备一优选的实施例中,当所述目录树操作为单路径读取时,加锁装置12包括:
一一单元,用于从所述操作路径的根结点开始,将所述根结点对应的当前层的层值设置为0,所述操作路径为被读取对象的父路径;例如,从所述操作路径的根结点开始目录树的加锁流程,设置根结点对应的当前层的层值Level=0;
一二单元,用于计算所述操作路径的当前层的当前结点的名称的哈希值,根据当前层下标在层顺序表中查找到的对应的当前层顺序锁表,在所述当前层顺序锁表中对下标为所述哈希值的读写锁对象加读锁,所述哈希值的范围为[0,固定数量-1];例如,计算操作路径的当前层Level的当前结点的名称的哈希值Hash,其中,所述哈希值范围为[0,固定数量MAXLOCKS-1],并根据当前层下标Level在层顺序表中找到对应的当前层Level的顺序锁表,并在当前层Level的顺序锁表中对下标为所述哈希值Hash的读写锁对象加读锁;
在所述一二单元中,通过哈希函数来计算每个结点对应的确定的哈希值(例如,根据结点的名称、结点的内存位置等来计算),然后该结点对应的读写锁对象即是目录树相应层的顺序锁表中下标为哈希值对应的读写锁对象;由于哈希函数的值域是有限的(0到固定数量-1)故能够用有限的读写锁对象服务不确定数量的结点。例如,目录树的当前层一共10个锁读写锁对象[0,9],结点的哈希值hash('a/')=1,hash('b/')=2,hash('c/')=1,那么对‘a/’和‘c/’加锁时,就操作当前层的顺序锁表中的对象下标为1的读写锁对象加读锁;对‘b/’操作当前层的顺序锁表中的对象下标为2的读写锁对象加读锁,以实现部分结点共用同一个读锁对象,进而实现读锁的并发访问;
一三单元,用于判断所述当前结点是否为所述操作路径中的最后一个结点,
若是,则对所述操作路径加锁成功;
若否,则在所述当前结点的子结点列表中,按照当前结点的下一层目录的名称,查找对应的子结点,若未找到,则所述目录树读取操作失败,若找到,则将当前层的层值加1后转到所述一二单元的执行逻辑中。例如,判断操作路径的当前层Level的当前结点是否为所述操作路径中的最后一个结点,若是,则对所述操作路径加锁成功,加锁流程结束;若否,则在所述当前结点的子结点列表中,按照当前结点的下一层目录的名称Name,查找对应的子结点:(a)若未找到,则所述目录树读取操作失败,用于指示所述被读取对象的父路径对应的操作路径不存在(即路径不存在),加锁流程结束;例如,备读取对象不存在的情况如下:要访问被读取对象‘/a/b/c’时,但是‘b/’目录其实并不存在,不存在则返回错误码,结束加锁流程即可;(b)若查找到,则设置当前层的层值Level=Level+1,并返回所述一二单元的执行逻辑中继续执行。
本申请的目录树的加锁设备一优选的实施例中,当所述目录树操作为单路径读取时,加锁装置12中的所述单路径读取包括目录存在性判断、文件存在性判断、列出目录的子结点、获取文件信息和获取目录信息中的任一种。例如,所述单路径读取包括了:“目录存在性判断或文件存在性判断”(Exist)、“列出目录的子结点”(List Directory)、“获取文件信息或获取目录信息”(Get Meta)”等。
在此,在对多个目录树操作进行操作路径的加锁时,是对被读取对象的父目录采用上述加锁装置12的加锁方式进行相应的加锁的。例如,当所述目录树操作为判断文件‘/a/b/c’的存在性时,会对路径“/a/b/”执行上述所述目录树操作为“单路径读取”时对应的加锁装置12中的加锁方式进行加锁,依次对操作路径中的根结点‘/’、结点‘a/’、结点‘b/’加读锁,在b/的数据结构中,即可判断文件c的存在性。又例如,当所述目录树操作为列出目录/a/b/的子结点时,会对路径“/a/b/”执行上述所述目录树操作为“单路径读取”时对应的步骤S12中的加锁方式进行加锁,依次对根结点‘/、’结点‘a/’、结点‘b/’加读锁,在b/的数据结构中,即可获取所有子结点信息。
在本申请的目录树的加锁设备一优选的实施例中,当所述目录树操作为单路径删除时,加锁装置12包括:
二一单元,用于从所述操作路径的根结点开始,将所述根结点对应的当前层的层值设置为0,所述操作路径为被删除对象的父路径;例如,从所述操作路径的根结点开始目录树的加锁流程,设置根结点对应的当前层的层值Level=0;
二二单元,用于计算所述操作路径的当前层的当前结点的名称的哈希值,所述哈希值的范围为[0,固定数量-1];例如,计算操作路径的当前层Level的当前结点的名称的哈希值Hash,其中,所述哈希值范围为[0,固定数量MAXLOCKS-1];
二三单元,用于根据当前层下标在层顺序表中查找到的对应的当前层顺序锁表,在所述当前层顺序锁表中查找下标为所述哈希值的读写锁对象,判断所述当前结点是否为所述操作路径中的最后一个结点,若是,则对下标为所述哈希值的读写锁对象加写锁,若否,则对下标为所述哈希值的读写锁对象加读锁,并在所述当前结点的子结点列表中,按照当前结点的下一层目录的名称,查找对应的子结点,若未找到,则所述目录树删除操作失败,若找到,则将当前层的层值加1后转到所述二二单元的执行逻辑中。例如,根据当前层下标Level在层顺序表中找到对应的当前层Level的顺序锁表,并在当前层Level的顺序锁表中对下标为所述哈希值Hash的读写锁对象加读锁,并判断操作路径的当前层Level的当前结点是否为所述操作路径中的最后一个结点,若是,则对下标为所述哈希值的读写锁对象加写锁,用于指示对所述操作路径加锁成功,加锁流程结束;若否,则对下标为所述哈希值的读写锁对象加读锁,并在所述当前结点的子结点列表中,按照当前结点的下一层目录的名称Name,查找对应的子结点:(a)若未找到,则所述目录树删除操作失败,用于指示所述被删除对象的父路径对应的操作路径不存在,加锁流程结束;(b)若查找到,则设置当前层的层值Level=Level+1,并返回所述二二单元的执行逻辑中继续执行。
本申请的目录树的加锁设备一优选的实施例中,当所述目录树操作为单路径删除时,加锁装置12中的所述单路径删除包括:删除目录或删除文件(Delete File/Directory)等。
在此,在对目录树操作进行操作路径的加锁时,是对被删除对象的父目录采用上述加锁装置12的加锁方式进行相应的加锁。例如,(1)删除目录/a/b/c/时,对被删除目录的父路径‘/a/b/’执行上述所述目录树操作为“单路径删除”时对应的加锁装置12中的加锁方式进行加锁,依次对对操作路径中的根结点‘/’、结点‘a/’加读锁,对‘b/’加写锁,在b/的数据结构中获取待删目录c/的信息,然后递归地删除c/及其所有子结点的数据结构;(2)删除文件/a/b/f时,对被删除文件的父路径‘/a/b/’执行上述所述目录树操作为“单路径删除”时对应的加锁装置12中的加锁方式进行加锁,依次对根结点‘/’、结点‘a/’加读锁,对‘b/’加写锁,在b/的数据结构中获取待删文件f涉及的所有相关数据信息,然后删除待删文件f涉及的所有相关数据信息。
本申请的目录树的加锁方法一优选的实施例中,当所述目录树操作为单路径创建时,加锁装置12包括:
三一单元,用于从所述操作路径的根结点开始,将所述根结点对应的所述目录树的当前层的层值设置为0,所述操作路径为被创建对象的父路径,并预置待加锁类型为读锁;例如,从所述操作路径的根结点开始目录树的加锁流程,设置根结点对应的当前层的层值Level=0,并预置待加锁类型LOCK_TYPE=读锁以用于后续释放对应的锁后并重新加锁,以改变该待加锁类型;
三二单元,用于计算所述操作路径的当前层的当前结点的名称的哈希值,所述哈希值的范围为[0,固定数量-1];例如,计算操作路径的当前层Level的当前结点的名称的哈希值Hash,其中,所述哈希值范围为[0,固定数量MAXLOCKS-1];
三三单元,用于根据当前层下标在层顺序表中查找到的对应的当前层顺序锁表,在所述当前层顺序锁表中查找下标为所述哈希值的读写锁对象,判断所述当前结点是否为所述操作路径中的最后一个结点:
若是,则将下标为所述哈希值的读写锁对象加写锁;
若否,则将下标为所述哈希值的读写锁对象加所述待加锁类型对应的锁,,同时若所述下标为所述哈希值的读写锁对象加所述待加锁类型不是写锁,则在所述当前结点的子结点列表中,按照当前结点的下一层目录的名称,查找对应的子结点,若未找到,则将待加锁类型由读锁修改为写锁后,重新执行所述三三单元的执行逻辑,若找到,则将当前层的层值加1后转到所述三二单元的执行逻辑中。例如,根据当前层下标Level在层顺序表中找到对应的当前层Level的顺序锁表,并在当前层Level的顺序锁表中对下标为所述哈希值Hash的读写锁对象加读锁,并判断操作路径的当前层Level的当前结点是否为所述操作路径中的最后一个结点,若是,则对下标为所述哈希值Hash的读写锁对象加写锁,用于指示对所述操作路径加锁成功,加锁流程结束;若否,则下标为所述哈希值Hash的读写锁对象加所述待加锁类型LOCK_TYPE对应的锁,同时,判断所述哈希值Hash的读写锁对象加所述待加锁类型LOCK_TYPE对应的锁,若所述哈希值Hash的读写锁对象加所述待加锁类型LOCK_TYPE为写锁,则加锁流程结束,若所述哈希值Hash的读写锁对象加所述待加锁类型LOCK_TYPE为不是写锁,则继续在所述当前结点的子结点列表中,按照当前结点的下一层目录的名称Name,查找对应的子结点:(a)若未找到,则表示所述操作路径的后续路径不存在,需要释放掉当前层Level的当前结点的读锁并重新加与所述待加锁类型对应的锁,将待加锁类型LOCK_TYPE由读锁修改为写锁,即设置LOCK_TYPE=写锁后,重新执行所述三三单元的执行逻辑;(b)若查找到,则设置当前层的层值Level=Level+1,并返回所述三二单元的执行逻辑中继续执行。
在上述优选实施例中,当所述目录树操作为单路径创建时,若中途找不到所述操作路径的当前结点的下一结点时,指示需要从操作路径的当前结点开始往后创建所述操作路径的当前结点后续对应的路径,因此在所述三三单元中需要将当前结点已加的与所述待加锁类型LOCK_TYPE对应的锁释放并改变所述待加锁的类型,故该待加锁类型LOCK_TYPE可以是写锁亦可以是读锁。例如,创建目录‘/a/b/c/’时,如果拿住‘a/’读锁发现‘b/’不存在,则指示需要创建‘a/’往后的内容,此时需要释放‘a/’已加的读锁,重新去拿‘a/’对应的写锁,然后创建‘b/c/’,并将‘b/c/’加入到‘a/’的子结点列表中。
本申请的目录树的加锁方法一优选的实施例中,当所述目录树操作为单路径创建时,加锁装置12中的所述单路径创建包括:创建目录或创建文件(Create File/Directory)等。
在此,在对目录树操作进行操作路径的加锁时,是对被创建对象的父目录采用上述加锁装置12的加锁方式进行相应的加锁。例如,在目录‘/a/b/’中创建文件‘/a/b/c/f’时,对被创建文件‘/a/b/c/f’执行上述所述目录树操作为“单路径创建”时对应的加锁装置12中的加锁方式进行加锁,由于‘c/’不存在,依次对操作路径中的根结点‘/’、结点‘a/’加读锁,对‘b/’加写锁(‘b/’先加的读锁被释放掉),然后递归地在‘b/’的数据结构中创建相应的目录c/及其所包含的所有与文件f相关的所有数据信息。
本申请的目录树的加锁设备一优选的实施例中,当述目录树操作为双路径访问时,加锁装置12包括:
四一单元,用于从所述操作路径的根结点开始,将所述根结点对应的当前层的层值设置为0,所述操作路径包括源路径和目的路径,并设置所述源路径和所述目的路径的待加锁类型为无锁,其中,所述源路径为源访问对象的父路径,所述目的路径为目标访问对象的父路径;例如,从所述操作路径的根结点开始目录树的加锁流程,设置根结点对应的当前层的层值Level=0,并预置所述源路径的待加锁类型SRC_LOCK_TYPE=无锁,预置所述目的路径的待加锁类型DEST_LOCK_TYPE=无锁;
四二单元,用于计算所述源路径与所述目的路径的公共路径,以减少重复加锁,因为公共路径里面的结点,对于所述源路径和所述目的路径来说,其实是同一个目录树中的结点,为了防止同一个读写锁对象对源路径和目的路径拿两遍,故计算源路径和目的路径的公共路径,以保证同一个目录树中的结点只拿一次,以减少不必要的重复拿锁,此处并不是减少加锁的锁粒度;例如,计算源路径SRC和目的路径DEST的公共路径COMMON,即,若源路径为‘/a/b/c/d/’,目的路径为‘/a/b/e/g/h’,则计算得到的源路径/a/b/c/d/’与目的路径/a/b/e/g/h’的公共路径为‘/a/b/’;
四三单元,用于计算所述源路径的当前层的当前结点的名称的源端哈希值,计算所述目的路径的当前层的当前结点的名称的目的端哈希值,修改所述源路径的待加锁类型,根据所述公共路径修改目的路径的待加锁类型;例如,计算源路径的当前层Level的当前结点的名称的源端哈希值HashSRC,其中,所述源端哈希值范围为[0,固定数量MAXLOCKS-1],计算目的路径的当前层Level的当前结点的名称的目的端哈希值HashDEST,其中,所述目的端哈希值范围为[0,固定数量MAXLOCKS-1],接着判断该源路径的当前层Level是否为所述源路径的最后一个结点,以修改所述源端待加锁类型SRC_LOCK_TYPE对应的锁,并基于所述公共路径COMMON修改所述目的端待加锁类型DEST_LOCK_TYPE对应的锁;
四七单元,用于分别根据源路径和目标路径的当前层下标在层顺序表中查找到的对应的源路径和目标路径的当前层顺序锁表,分别在所述源路径和目标路径的当前层顺序锁表中查找下标为所述源端哈希值和目的端哈希值的读写锁对象,根据源路径和目的路径的待加锁类型,依次对所述下标为所述源端哈希值和目的端哈希值的读写锁对象加锁;例如,根据源路径的当前层下标Level在层顺序表中找到对应的当前层Level的顺序锁表,并在当前层Level的顺序锁表中对下标为所述源端哈希值HashSRC的读写锁对象加锁,并根据所述源路径的待加锁类型SRC_LOCK_TYPE,依次对所述下标为所述源端哈希值HashSRC的读写锁对象加锁;并根据目的路径的当前层下标Level在层顺序表中找到对应的当前层Level的顺序锁表,并在当前层Level的顺序锁表中对下标为所述目的端哈希值HashDEST的读写锁对象加锁,并根据所述目的路径的待加锁类型DEST_LOCK_TYPE,依次对所述下标为所述目的端哈希值HashDEST的读写锁对象加锁;
四八单元,用于若所述源端哈希值存在,则在所述源路径的当前结点的子结点列表中,按照当前结点的下一层目录的名称,查找对应的子结点,若未找到,则所述源路径不存在,若找到,则执行所述四九单元的执行逻辑;例如,如果源端哈希值HashSRC存在,则在所述源路径的当前结点的子结点列表中,按照当前结点的下一层目录的名称Name,查找对应的子结点:(a)若未找到,则表示所述源路径不存在,所述双路径访问对应的加锁流程结束;(b)若查找到,则继续执行所述四九单元的执行逻辑中;
四九单元,用于若所述目的端哈希值存在,则在所述目的径的当前结点的子结点列表中,按照当前结点的下一层目录的名称,查找对应的子结点,若找到,则将当前层的层值加1后转到所述四三单元的执行逻辑中,若未找到,则释放所述源路径和目的路径的当前层的已加锁,并将所述目的路径的待加锁类型设置为写锁后执行所述四七单元的执行逻辑。例如,如果目的端哈希值HashDEST存在,则在所述目的路径的当前结点的子结点列表中,按照当前结点的下一层目录的名称Name,查找对应的子结点:(a)若查找到,则设置当前层的层值Level=Level+1后转至所述四三单元的执行逻辑;(b)若未查找到,则表明目的路径中的后续路径不存在,需要创建新的子结点,然后记录到相应的当前结点的子结点列表中,故需释放掉所述源路径和所述目的路径的当前层Level已加的所有锁,并将所述目的路径的待加锁类型设置为写锁后,即设置DEST_LOCK_TYPE=写锁后继续执行所述四七单元的执行逻辑。
接着本申请的上述目录树的加锁设备一优选的实施例,所述四三单元用于:
若源路径的当前层在所述源路径的总层数内,则计算所述源路径的当前层的当前结点的名称的源端哈希值,所述源端哈希值的范围为[0,固定数量-1];否则,所述源端哈希值不存在。例如,如果所述源路径的当前层Level小于所述源路径SRC的总层数,计算所述源路径SRC的当前层Level的当前结点的名称的源端哈希值HashSRC,其中,所述源端哈希值HashSRC的范围为[0,MAXLOCKS-1];否则,说明所述源路径不需要进行加锁了,则标记该源端哈希值HashSRC为不存在,比如,将文件‘/a/b’重命名到目录‘/a/c/d/e/f/e/’,由于源路径的层数比目的路径的层数少,源路径加锁到‘a/’后面的层数就没有锁需要加了,故标记为源端哈希值HashSRC为不存在。
接着本申请的上述目录树的加锁设备一优选的实施例,所述四三单元用于:
若目的路径的当前层在所述目的路径的总层数内,则计算所述目的路径的当前层的当前结点的名称的目的端哈希值,所述目的端哈希值的范围为[0,固定数量-1];否则,所述目的端哈希值不存在。例如,如果所述目的路径的当前层Level小于所述目的路径DEST的总层数,计算所述目的路径DEST的当前层Level的当前结点的名称的目的端哈希值HashDEST,其中,所述目的端哈希值HashDEST的范围为[0,MAXLOCKS-1];否则,说明所述目的路径不需要进行加锁了,则标记该目的端哈希值HashDEST为不存在,由于源路径和目的路径的层数可以不一样,所以可能一端(源路径或目的路径)已经加完锁了,但是还要等另一端(源路径或目的路径)加完锁整个流程才结束,故此处对不需要进行加锁的目的路径的目的端哈希值HashDEST标记为不存在。
接着本申请的上述目录树的加锁设备一优选的实施例,所述四三单元用于:
若所述源路径的当前结点是所述源路径中的最后一个结点,则将所述源路径的待加锁类型设置为预置锁类型,否则,将所述源路径的待加锁类型设置为读锁。例如,判断所述源路径的当前层Level的当前结点是否为所述源路径中的最后一个结点,若是,则设置所述源端待加锁类型SRC_LOCK_TYPE设置为预置锁类型,其中,所述预置锁类型为SRC_END_LOCK_TYPE,进一步地,所述SRC_END_LOCK_TYPE为所述源路径的最后一个结点的锁类型,且所述源路径的最后一个结点对应的SRC_END_LOCK_TYPE的锁类型由流程发起者预先设定的;否则,将所述源路径的待加锁类型SRC_LOCK_TYPE设置为,即SRC_LOCK_TYPE=读锁。
接着本申请的上述目录树的加锁设备一优选的实施例,所述四三单元用于:
若所述源路径的待加锁类型为写锁,且所述目的路径的当前层的当前结点在所述公共路径中,则将所述目的路径的待加锁类型设置为无锁,否则,判断所述目的路径的当前层的当前结点是否为所述目的路径的最后一个结点,若是,则将所述目的路径的待加锁类型设置为写锁;若否,则将所述目的路径的待加锁类型设置为读锁。例如,所述源路径的待加锁类型SRC_LOCK_TYPE=写锁,且所述目的路径的当前层Level的当前结点在所述公共路径COMMON中,则设置所述目的路径的待加锁类型DEST_LOCK_TYPE=无锁,即不需要再对目录树中的公共路径中的当前结点对应的读写锁对象再加锁,以减少重复加锁;否则,判断所述目的路径的当前层Level的当前结点是否为所述目的路径中的最后一个结点,若是,则将所述目的路径的待加锁类型DEST_LOCK_TYPE设置为写锁,即DEST_LOCK_TYP=写锁,若否,则将所述目的路径的待加锁类型DEST_LOCK_TYPE设置为读锁,即DEST_LOCK_TYP=读锁。
接着本申请的上述目录树的加锁设备一优选的实施例,所述四四单元用于:
若所述源端哈希值和所述目的端哈希值均不存在,则对所述源路径的当前层的当前结点和目的路径的当前层的当前结点对应的读写锁对象不加锁。例如,如果源端哈希值HashSRC或者目的端哈希值HashDEST不存在,则表明源路径或者所述目的路径已经加锁完毕,不需要再对所述源路径或所述目的路径再加锁。
接着本申请的上述目录树的加锁设备一优选的实施例,所述四四单元用于:
若所述源端哈希值和所述目的端哈希值均存在且不相同,则基于所述源端哈希值和目的端哈希值的大小按预设顺序,对所述层顺序表的当前层的锁顺序表中,下标为所述源端哈希值和目的端哈希值的读写锁对象分别加所述源路径和目的路径的待加锁类型的锁。在此,所述预设顺序可以是从小到大的顺序,亦可以是从大到小的顺序,在本申请的实施例中不受限制,只要是按序对源路径和目的路径进行加锁以防止死锁情况发生,例如,若出现一个目录树操作先加了‘a/’写锁再去加‘b/’写锁,另外一个操作先加‘b/’写锁再去加‘a/’写锁,就会相互处于锁等待,导致死锁了,故需要按照目的端哈希值和源端哈希值的大小的预设顺序进行加锁,以防止死锁;例如,若所述源端哈希值HashSRC和所述目的端哈希值HashDEST均存在且不相同,分别根据所述源路径的当前层下标在层顺序表中查找到的对应的当前层顺序锁表,在所述当前层顺序锁表中查找下标为所述源端哈希值HashSRC的读写锁对象,并对所述源端哈希值的读写锁对象加所述源路径的待加锁类型SRC_LOCK_TYPE的锁;根据所述目的路径的当前层下标在层顺序表中查找到的对应的当前层顺序锁表,在所述当前层顺序锁表中查找下标为所述目的端哈希值HashDEST的读写锁对象,并对所述目的端哈希值的读写锁对象加所述目的路径的待加锁类型DEST_LOCK_TYPE的锁。
接着本申请的上述目录树的加锁设备一优选的实施例,所述四四单元用于:
若所述源端哈希值和目的端哈希值均存在且相同,则判断源路径的待加锁类型和目的路径的待加锁类型的其中之一是否是写锁,若是,则将下标为所述源端哈希值和目的端哈希值的读写锁对象加写锁;若否,则将下标为所述源端哈希值和目的端哈希值的读写锁对象加读锁。例如,若所述源端哈希值HashSRC和所述目的端哈希值HashDEST均存在且相同,分别根据所述源路径的当前层下标在层顺序表中查找到的对应的当前层顺序锁表,在所述当前层顺序锁表中查找下标为所述源端哈希值HashSRC的读写锁对象,根据所述目的路径的当前层下标在层顺序表中查找到的对应的当前层顺序锁表,在所述当前层顺序锁表中查找下标为所述目的端哈希值HashDEST的读写锁对象,判断源路径的待加锁类型SRC_LOCK_TYPE和目的路径的待加锁类型DEST_LOCK_TYPE的其中之一是否是写锁,若是,则分别将下标为所述源端哈希值HashSRC和目的端哈希值HashDEST的读写锁对象加写锁;若否,则分别将下标为所述源端哈希值HashSRC和目的端哈希值HashDEST的读写锁对象加读锁。
本申请的目录树的加锁设备一优选的实施例中,当所述目录树操作为双路径访问时,加锁装置12中的所述双路径访问包括文件、目录重命名(Rename File/Directory)或文件链接(Hardlink File)等。
在此,在“文件或目录重命名”(Rename File/Directory)操作中使用“双路径访问”加锁流程时,所述源路径SRC为被重命名的文件或目录的父目录,目的路径DEST为重命名目的文件或目录的父目录。同时,由于被重命名的文件或目录要被移走,因此设置预置锁类型SRC_END_LOCK_TYPE=“写锁”。
在此,在“文件链接”(Hardlink File)操作中使用“双路径访问”加锁流程时,所述源路径SRC为被链接文件的父目录,所述目的路径DEST为链接目标文件的父目录。同时,由于源路径对应的文件不需要被修改,因此设置预置锁类型SRC_END_LOCK_TYPE=“读锁”。
在此,若所述目录树操作为将源文件链接到目的文件时,是源文件的父目录和目的文件的父目录采用上述加锁装置12的双路径访问对应的加锁方式进行相应的加锁;例如:(1)将源文件‘/a/b/f1’链接到目的‘/a/g/h/f2’时,SRC=‘/a/b/’且DEST=‘/a/g/h/’,依次对根结点‘/’、结点‘a/’加读锁,对结点‘b/’加读锁,对g/加读锁(其中,处于目录树中的同一层的‘b/’和‘g/’的加锁顺序取决于各自对应的哈希值大小),对‘h/’加写锁。若所述目录树操作为将源文件链接到目的文件时,是源文件的父目录和目的文件的父目录采用上述加锁装置12的双路径访问对应的加锁方式进行相应的加锁;例如:(2)将源目录‘/a/b/c/d/e/’重命名到目的目‘/a/g/m/’时,SRC=‘/a/b/c/d/’且DEST=‘/a/g/’,依次对‘/’、‘a/’加读锁,对‘b/’加读锁,对‘g/’加写锁(其中,处于目录树中的同一层的‘b/’和‘g/’的加锁顺序取决于其哈希值大小),对‘c/’加读锁,对‘d/’加写锁。
需要说明的是,上述的所有目录树操作,在所述目录树操作完毕后,均释放掉其拿到的所有锁。
在本申请的上述优选实施例中,通过采用上述加锁流程的目录树操作并发执行时可以保证操作过程的安全性:由于对不同操作路径下对应的同一个结点进行加写锁时,其中有一个操作路径在对该结点加写锁时,后续其他操作路径则需要按照加写锁的先后顺序对该结点进行加写锁,以实现结点的数据结构不会被并发,同理按照对该结点的加读锁顺序或者加写锁顺序对该结点进行加锁,也能实现结点的数据结构不会被边改边读;通过采用上述加锁流程的目录树操作并发执行时可以保证操作过程的活性:不会产生死锁,因为对所有操作路径对应的结点加锁的顺序为先按照层次加锁,在层次内按照哈希值的大小来实现结点的相应加锁,其中在目录树操作为双路径访问时,源路径的当前结点对应的源端哈希值和目的路径的当前结点对应的目的端哈希值按照预设顺序对相应的读写锁对象,这个全局唯一顺序保证了各种操作并发访问时不会出现死锁情况;例如,死锁的一个例子是说有人拿住A锁再去拿B锁,另外有人拿住B锁再去拿A锁,这时都拿不到对方持有的锁,就死锁了,而本申请是将所有人都按照一个全局唯一顺序拿锁,就能够避免此种死锁情况,从而实现对各种目录树操作并发访问进行高效加锁。
综上所述,本申请通过预先分配对应于目录树各层结点的读写锁对象,能够避免动态创建和回收读写锁对象的内存管理开销,从而减少内存管理开销,以提高目录树操作性能;根据目录树操作,对操作路径中的各结点所对应的读写锁对象加读锁或写锁,以实现对所述操作路径的加锁粒度小的情况下,保证所述目录树操作并发访问时不会出现死锁情况,进而通过减少锁冲突来降低目录树并发操作的延迟,提高处理目录树操作的吞吐量,进一步地,在所述目录树操作为双路径访问时,分别对操作路径中的源路径和目的路径中的各结点所对应的读写锁对象加读锁或写锁,实现了对Rename Directory(重命名)操作过程中的操作路径的高效加锁。
进一步的,本申请通过预先分配对应于目录树各层结点的读写锁对象,包括:对于目录树的每一层,预先分配好固定数量个读写锁对象并放置于顺序锁表中,其中,所述顺序锁表中每一个读写锁对象对应于唯一对象下标,所述对象下标值的范围为[0,固定数量-1];将所有层的顺序锁表,按照层下标汇总到层顺序表中,以实现通过两次访问层顺序表和顺序锁表的下标值能够直接获取唯一对应的预先分配好的读写锁对象,够避免动态创建和回收读写锁对象的内存管理开销,从而减少内存管理开销,以提高目录树操作性能。
根据本申请的另一面,还提供一种基于计算的设备,包括:
处理器;以及
被安排成存储计算机可执行指令的存储器,所述可执行指令在被执行时使所述处理器:
预先分配对应于目录树各层结点的读写锁对象;
根据目录树操作,对操作路径中的各结点所对应的读写锁对象加读锁或写锁。
显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本申请的精神和范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。
需要注意的是,本申请可在软件和/或软件与硬件的组合体中被实施,例如,可采用专用集成电路(ASIC)、通用目的计算机或任何其他类似硬件设备来实现。在一个实施例中,本申请的软件程序可以通过处理器执行以实现上文所述步骤或功能。同样地,本申请的软件程序(包括相关的数据结构)可以被存储到计算机可读记录介质中,例如,RAM存储器,磁或光驱动器或软磁盘及类似设备。另外,本申请的一些步骤或功能可采用硬件来实现,例如,作为与处理器配合从而执行各个步骤或功能的电路。
另外,本申请的一部分可被应用为计算机程序产品,例如计算机程序指令,当其被计算机执行时,通过该计算机的操作,可以调用或提供根据本申请的方法和/或技术方案。而调用本申请的方法的程序指令,可能被存储在固定的或可移动的记录介质中,和/或通过广播或其他信号承载媒体中的数据流而被传输,和/或被存储在根据所述程序指令运行的计算机设备的工作存储器中。在此,根据本申请的一个实施例包括一个装置,该装置包括用于存储计算机程序指令的存储器和用于执行程序指令的处理器,其中,当该计算机程序指令被该处理器执行时,触发该装置运行基于前述根据本申请的多个实施例的方法和/或技术方案。
对于本领域技术人员而言,显然本申请不限于上述示范性实施例的细节,而且在不背离本申请的精神或基本特征的情况下,能够以其他的具体形式实现本申请。因此,无论从哪一点来看,均应将实施例看作是示范性的,而且是非限制性的,本申请的范围由所附权利要求而不是上述说明限定,因此旨在将落在权利要求的等同要件的含义和范围内的所有变化涵括在本申请内。不应将权利要求中的任何附图标记视为限制所涉及的权利要求。此外,显然“包括”一词不排除其他单元或步骤,单数不排除复数。装置权利要求中陈述的多个单元或装置也可以由一个单元或装置通过软件或者硬件来实现。第一,第二等词语用来表示名称,而并不表示任何特定的顺序。

Claims (47)

1.一种目录树的加锁方法,其中,所述方法包括:
预先分配对应于目录树各层结点的读写锁对象,具体包括:
对于目录树的每一层,预先分配好固定数量个读写锁对象并放置于顺序锁表中,其中,所述顺序锁表中每一个读写锁对象对应于唯一对象下标,所述对象下标值的范围为[0,固定数量-1];将所有层的顺序锁表,按照层下标汇总到层顺序表中;
根据目录树操作,对操作路径中的各结点所对应的读写锁对象加读锁或写锁。
2.根据权利要求1所述的方法,其中,当所述目录树操作为单路径读取时,根据目录树操作,对操作路径中的各结点所对应的读写锁对象加读锁或写锁,包括:
步骤一一、从所述操作路径的根结点开始,将所述根结点对应的当前层的层值设置为0,所述操作路径为被读取对象的父路径;
步骤一二、计算所述操作路径的当前层的当前结点的名称的哈希值,根据当前层下标在层顺序表中查找到的对应的当前层顺序锁表,在所述当前层顺序锁表中对下标为所述哈希值的读写锁对象加读锁,所述哈希值的范围为[0,固定数量-1];
步骤一三、判断所述当前结点是否为所述操作路径中的最后一个结点,若是,则对所述操作路径加锁成功。
3.根据权利要求2所述的方法,其中,所述步骤一三中的判断所述当前结点是否为所述操作路径中的最后一个结点之后,还包括:
若否,则在所述当前结点的子结点列表中,按照当前结点的下一层目录的名称,查找对应的子结点,若未找到,则所述目录树读取操作失败,若找到,则将当前层的层值加1后转到所述步骤一二。
4.根据权利要求2所述的方法,其中,所述单路径读取包括目录存在性判断、文件存在性判断、列出目录的子结点、获取文件信息和获取目录信息中的任一种。
5.根据权利要求1所述的方法,其中,当所述目录树操作为单路径删除时,根据目录树操作,对操作路径中的各结点所对应的读写锁对象加读锁或写锁,包括:
步骤二一、从所述操作路径的根结点开始,将所述根结点对应的当前层的层值设置为0,所述操作路径为被删除对象的父路径;
步骤二二、计算所述操作路径的当前层的当前结点的名称的哈希值,所述哈希值的范围为[0,固定数量-1];
步骤二三、根据当前层下标在层顺序表中查找到的对应的当前层顺序锁表,在所述当前层顺序锁表中查找下标为所述哈希值的读写锁对象,判断所述当前结点是否为所述操作路径中的最后一个结点,
若是,则对下标为所述哈希值的读写锁对象加写锁。
6.根据权利要求5所述的方法,其中,判断所述当前结点是否为所述操作路径中的最后一个结点之后,还包括:
若否,则对下标为所述哈希值的读写锁对象加读锁,并在所述当前结点的子结点列表中,按照当前结点的下一层目录的名称,查找对应的子结点,
若未找到,则所述目录树删除操作失败,若找到,则将当前层的层值加1后转到所述步骤二二。
7.根据权利要求5所述的方法,其中,所述单路径删除包括删除目录或删除文件。
8.根据权利要求1所述的方法,其中,当所述目录树操作为单路径创建时,根据目录树操作,对操作路径中的各结点所对应的读写锁对象加读锁或写锁,包括:
步骤三一、从所述操作路径的根结点开始,将所述根结点对应的所述目录树的当前层的层值设置为0,所述操作路径为被创建对象的父路径,并预置待加锁类型;
步骤三二、计算所述操作路径的当前层的当前结点的名称的哈希值,所述哈希值的范围为[0,固定数量-1];
步骤三三、根据当前层下标在层顺序表中查找到的对应的当前层顺序锁表,在所述当前层顺序锁表中查找下标为所述哈希值的读写锁对象,判断所述当前结点是否为所述操作路径中的最后一个结点,
若是,则将下标为所述哈希值的读写锁对象加写锁。
9.根据权利要求8所述的方法,其中,判断所述当前结点是否为所述操作路径中的最后一个结点之后,还包括:
若否,则将下标为所述哈希值的读写锁对象加所述待加锁类型对应的锁,同时若所述下标为所述哈希值的读写锁对象加所述待加锁类型不是写锁,则在所述当前结点的子结点列表中,按照当前结点的下一层目录的名称,查找对应的子结点,若未找到,则将待加锁类型由读锁修改为写锁后,重新执行步骤三三。
10.根据权利要求9所述的方法,其中,按照当前结点的下一层目录的名称,查找对应的子结点之后,还包括:
若找到,则将当前层的层值加1后转到所述步骤三二。
11.根据权利要求8所述的方法,其中,所述单路径创建包括创建目录或文件。
12.根据权利要求1所述的方法,其中,当所述目录树操作为双路径访问时,根据目录树操作,对操作路径中的各结点所对应的读写锁对象加读锁或写锁,包括:
步骤四一、从所述操作路径的根结点开始,将所述根结点对应的当前层的层值设置为0,所述操作路径包括源路径和目的路径,并设置所述源路径和所述目的路径的待加锁类型为无锁,其中,所述源路径为源访问对象的父路径,所述目的路径为目标访问对象的父路径;
步骤四二、计算所述源路径与所述目的路径的公共路径;
步骤四三、计算所述源路径的当前层的当前结点的名称的源端哈希值,计算所述目的路径的当前层的当前结点的名称的目的端哈希值,修改所述源路径的待加锁类型,根据所述公共路径修改目的路径的待加锁类型;
步骤四七、分别根据源路径和目标路径的当前层下标在层顺序表中查找到的对应的源路径和目标路径的当前层顺序锁表,分别在所述源路径和目标路径的当前层顺序锁表中查找下标为所述源端哈希值和目的端哈希值的读写锁对象,根据源路径和目的路径的待加锁类型,依次对所述下标为所述源端哈希值和目的端哈希值的读写锁对象加锁;
步骤四八、若所述源端哈希值存在,则在所述源路径的当前结点的子结点列表中,按照当前结点的下一层目录的名称,查找对应的子结点,
若未找到,则所述源路径不存在。
13.根据权利要求12所述的方法,其中,所述步骤四八、若所述源端哈希值存在,则在所述源路径的当前结点的子结点列表中,按照当前结点的下一层目录的名称,查找对应的子结点之后,还包括:
若找到,则执行步骤四九;
步骤四九、若所述目的端哈希值存在,则在所述目的路径的当前结点的子结点列表中,按照当前结点的下一层目录的名称,查找对应的子结点,
若找到,则将当前层的层值加1后转到所述步骤四三。
14.根据权利要求13所述的方法,其中,所述步骤四九、若所述目的端哈希值存在,则在所述目的路径的当前结点的子结点列表中,按照当前结点的下一层目录的名称,查找对应的子结点之后,还包括:
若未找到,则释放所述源路径和目的路径的当前层的已加锁,并将所述目的路径的待加锁类型设置为写锁后执行所述步骤四七。
15.根据权利要求12所述的方法,其中,所述步骤四三、计算所述源路径的当前层的当前结点的名称的源端哈希值,计算所述目的路径的当前层的当前结点的名称的目的端哈希值,修改所述源路径的待加锁类型,根据所述公共路径修改目的路径的待加锁类型,包括:
若源路径的当前层在所述源路径的总层数内,则计算所述源路径的当前层的当前结点的名称的源端哈希值,所述源端哈希值的范围为[0,固定数量-1],否则,所述源端哈希值不存在。
16.根据权利要求12所述的方法,其中,所述步骤四三、计算所述源路径的当前层的当前结点的名称的源端哈希值,计算所述目的路径的当前层的当前结点的名称的目的端哈希值,修改所述源路径的待加锁类型,根据所述公共路径修改目的路径的待加锁类型,包括:
若目的路径的当前层在所述目的路径的总层数内,则计算所述目的路径的当前层的当前结点的名称的目的端哈希值,所述目的端哈希值的范围为[0,固定数量-1],否则,所述目的端哈希值不存在。
17.根据权利要求16所述的方法,其中,所述步骤四三、计算所述源路径的当前层的当前结点的名称的源端哈希值,计算所述目的路径的当前层的当前结点的名称的目的端哈希值,修改所述源路径的待加锁类型,根据所述公共路径修改目的路径的待加锁类型,包括:
若所述源路径的当前结点是所述源路径中的最后一个结点,则将所述源路径的待加锁类型设置为预置锁类型,否则,将所述源路径的待加锁类型设置为读锁。
18.根据权利要求17所述的方法,其中,步骤四三、计算所述源路径的当前层的当前结点的名称的源端哈希值,计算所述目的路径的当前层的当前结点的名称的目的端哈希值,修改所述源路径的待加锁类型,根据所述公共路径修改目的路径的待加锁类型,包括:
若所述源路径的待加锁类型为写锁,且所述目的路径的当前层的当前结点在所述公共路径中,则将所述目的路径的待加锁类型设置为无锁,否则,判断所述目的路径的当前层的当前结点是否为所述目的路径的最后一个结点,若是,则将所述目的路径的待加锁类型设置为写锁;若否,则将所述目的路径的待加锁类型设置为读锁。
19.根据权利要求18所述的方法,其中,根据源路径和目的路径的待加锁类型,依次对所述下标为所述源端哈希值和目的端哈希值的读写锁对象加锁,包括:
若所述源端哈希值和所述目的端哈希值均不存在,则对所述源路径的当前层的当前结点和目的路径的当前层的当前结点对应的读写锁对象不加锁。
20.根据权利要求19所述的方法,其中,根据源路径和目的路径的待加锁类型,依次对所述下标为所述源端哈希值和目的端哈希值的读写锁对象加锁,包括:
若所述源端哈希值和所述目的端哈希值均存在且不相同,则基于所述源端哈希值和目的端哈希值的大小按预设顺序,对所述层顺序表的当前层的锁顺序表中,下标为所述源端哈希值和目的端哈希值的读写锁对象分别加所述源路径和目的路径的待加锁类型的锁。
21.根据权利要求20所述的方法,其中,根据源路径和目的路径的待加锁类型,依次对所述下标为所述源端哈希值和目的端哈希值的读写锁对象加锁,包括:
若所述源端哈希值和目的端哈希值均存在且相同,则判断源路径的待加锁类型和目的路径的待加锁类型的其中之一是否是写锁,
若是,则将下标为所述源端哈希值和目的端哈希值的读写锁对象加写锁。
22.根据权利要求21所述的方法,其中,若所述源端哈希值和目的端哈希值均存在且相同,则判断源路径的待加锁类型和目的路径的待加锁类型的其中之一是否是写锁之后,还包括:
若否,则将下标为所述源端哈希值和目的端哈希值的读写锁对象加读锁。
23.根据权利要求12所述的方法,其中,所述双路径访问包括文件、目录重命名或文件链接。
24.一种目录树的加锁设备,其中,所述设备包括:
预置装置,用于预先分配对应于目录树各层结点的读写锁对象,具体包括:
对于目录树的每一层,预先分配好固定数量个读写锁对象并放置于顺序锁表中,其中,所述顺序锁表中每一个读写锁对象对应于唯一对象下标,所述对象下标值的范围为[0,固定数量-1];将所有层的顺序锁表,按照层下标汇总到层顺序表中;
加锁装置,用于根据目录树操作,对操作路径中的各结点所对应的读写锁对象加读锁或写锁。
25.根据权利要求24所述的设备,其中,当所述目录树操作为单路径读取时,所述加锁装置包括:
一一单元,用于从所述操作路径的根结点开始,将所述根结点对应的当前层的层值设置为0,所述操作路径为被读取对象的父路径;
一二单元,用于计算所述操作路径的当前层的当前结点的名称的哈希值,根据当前层下标在层顺序表中查找到的对应的当前层顺序锁表,在所述当前层顺序锁表中对下标为所述哈希值的读写锁对象加读锁,所述哈希值的范围为[0,固定数量-1];
一三单元,用于判断所述当前结点是否为所述操作路径中的最后一个结点,若是,则对所述操作路径加锁成功。
26.根据权利要求25所述的设备,其中,当所述目录树操作为单路径读取时,所述一三单元还用于:
若否,则在所述当前结点的子结点列表中,按照当前结点的下一层目录的名称,查找对应的子结点,若未找到,则所述目录树读取操作失败,若找到,则将当前层的层值加1后转到所述一二单元的执行逻辑中。
27.根据权利要求25所述的设备,其中,所述单路径读取包括目录存在性判断、文件存在性判断、列出目录的子结点、获取文件信息和获取目录信息中的任一种。
28.根据权利要求24所述的设备,其中,当所述目录树操作为单路径删除时,所述加锁装置包括:
二一单元,用于从所述操作路径的根结点开始,将所述根结点对应的当前层的层值设置为0,所述操作路径为被删除对象的父路径;
二二单元,用于计算所述操作路径的当前层的当前结点的名称的哈希值,所述哈希值的范围为[0,固定数量-1];
二三单元,用于根据当前层下标在层顺序表中查找到的对应的当前层顺序锁表,在所述当前层顺序锁表中查找下标为所述哈希值的读写锁对象,判断所述当前结点是否为所述操作路径中的最后一个结点,若是,则对下标为所述哈希值的读写锁对象加写锁。
29.根据权利要求28所述的设备,其中,当所述目录树操作为单路径删除时,所述二三单元还用于:
若否,则对下标为所述哈希值的读写锁对象加读锁,并在所述当前结点的子结点列表中,按照当前结点的下一层目录的名称,查找对应的子结点,若未找到,则所述目录树删除操作失败,若找到,则将当前层的层值加1后转到所述二二单元的执行逻辑中。
30.根据权利要求28所述的设备,其中,所述单路径删除包括删除目录或删除文件。
31.根据权利要求24所述的设备,其中,当所述目录树操作为单路径创建时,所述加锁装置包括:
三一单元,用于从所述操作路径的根结点开始,将所述根结点对应的所述目录树的当前层的层值设置为0,所述操作路径为被创建对象的父路径,并预置待加锁类型为读锁;
三二单元,用于计算所述操作路径的当前层的当前结点的名称的哈希值,所述哈希值的范围为[0,固定数量-1];
三三单元,用于根据当前层下标在层顺序表中查找到的对应的当前层顺序锁表,在所述当前层顺序锁表中查找下标为所述哈希值的读写锁对象,判断所述当前结点是否为所述操作路径中的最后一个结点,若是,则将下标为所述哈希值的读写锁对象加写锁。
32.根据权利要求31所述的设备,其中,当所述目录树操作为单路径创建时,所述三三单元还用于:
若否,则将下标为所述哈希值的读写锁对象加所述待加锁类型对应的锁,同时若所述下标为所述哈希值的读写锁对象加所述待加锁类型不是写锁,则在所述当前结点的子结点列表中,按照当前结点的下一层目录的名称,查找对应的子结点,若未找到,则将待加锁类型由读锁修改为写锁后,重新执行所述三三单元的执行逻辑。
33.根据权利要求32所述的设备,其中,当所述目录树操作为单路径创建时,所述三三单元还用于:
若找到,则将当前层的层值加1后转到所述三二单元的执行逻辑中。
34.根据权利要求31所述的设备,其中,所述单路径创建包括创建目录或文件。
35.根据权利要求24所述的设备,其中,当所述目录树操作为双路径访问时,所述加锁装置包括:
四一单元,用于从所述操作路径的根结点开始,将所述根结点对应的当前层的层值设置为0,所述操作路径包括源路径和目的路径,并设置所述源路径和所述目的路径的待加锁类型为无锁,其中,所述源路径为源访问对象的父路径,所述目的路径为目标访问对象的父路径;
四二单元,用于计算所述源路径与所述目的路径的公共路径;
四三单元,用于计算所述源路径的当前层的当前结点的名称的源端哈希值,计算所述目的路径的当前层的当前结点的名称的目的端哈希值,修改所述源路径的待加锁类型,根据所述公共路径修改目的路径的待加锁类型;
四七单元,用于分别根据源路径和目标路径的当前层下标在层顺序表中查找到的对应的源路径和目标路径的当前层顺序锁表,分别在所述源路径和目标路径的当前层顺序锁表中查找下标为所述源端哈希值和目的端哈希值的读写锁对象,根据源路径和目的路径的待加锁类型,依次对所述下标为所述源端哈希值和目的端哈希值的读写锁对象加锁;
四八单元,用于若所述源端哈希值存在,则在所述源路径的当前结点的子结点列表中,按照当前结点的下一层目录的名称,查找对应的子结点,若未找到,则所述源路径不存在。
36.根据权利要求35所述的设备,其中,当所述目录树操作为双路径访问时,所述四八单元还用于:
若找到,则转到四九单元的执行逻辑中;
四九单元,用于若所述目的端哈希值存在,则在所述目的路径的当前结点的子结点列表中,按照当前结点的下一层目录的名称,查找对应的子结点,若找到,则将当前层的层值加1后转到所述四三单元的执行逻辑中。
37.根据权利要求36所述的设备,其中,当所述目录树操作为双路径访问时,所述四八单元还用于:
若未找到,则释放所述源路径和目的路径的当前层的已加锁,并将所述目的路径的待加锁类型设置为写锁后执行所述四七单元的执行逻辑。
38.根据权利要求35所述的设备,其中,所述四三单元用于:
若源路径的当前层在所述源路径的总层数内,则计算所述源路径的当前层的当前结点的名称的源端哈希值,所述源端哈希值的范围为[0,固定数量-1],否则,所述源端哈希值不存在。
39.根据权利要求35所述的设备,其中,所述四三单元用于:
若目的路径的当前层在所述目的路径的总层数内,则计算所述目的路径的当前层的当前结点的名称的目的端哈希值,所述目的端哈希值的范围为[0,固定数量-1],否则,所述目的端哈希值不存在。
40.根据权利要求35所述的设备,其中,所述四三单元用于:
若所述源路径的当前结点是所述源路径中的最后一个结点,则将所述源路径的待加锁类型设置为预置锁类型,否则,将所述源路径的待加锁类型设置为读锁。
41.根据权利要求35所述的设备,其中,所述四三单元用于:
若所述源路径的待加锁类型为写锁,且所述目的路径的当前层的当前结点在所述公共路径中,则将所述目的路径的待加锁类型设置为无锁,否则,判断所述目的路径的当前层的当前结点是否为所述目的路径的最后一个结点,若是,则将所述目的路径的待加锁类型设置为写锁;若否,则将所述目的路径的待加锁类型设置为读锁。
42.根据权利要求38所述的设备,其中,所述四七单元用于:
若所述源端哈希值和所述目的端哈希值均不存在,则对所述源路径的当前层的当前结点和目的路径的当前层的当前结点对应的读写锁对象不加锁。
43.根据权利要求42所述的设备,其中,所述四七单元用于:
若所述源端哈希值和所述目的端哈希值均存在且不相同,则基于所述源端哈希值和目的端哈希值的大小按预设顺序,对所述层顺序表的当前层的锁顺序表中,下标为所述源端哈希值和目的端哈希值的读写锁对象分别加所述源路径和目的路径的待加锁类型的锁。
44.根据权利要求42所述的设备,其中,所述四七单元用于:
若所述源端哈希值和目的端哈希值均存在且相同,则判断源路径的待加锁类型和目的路径的待加锁类型的其中之一是否是写锁,
若是,则将下标为所述源端哈希值和目的端哈希值的读写锁对象加写锁。
45.根据权利要求44所述的设备,其中,所述四七单元用于:
若否,则将下标为所述源端哈希值和目的端哈希值的读写锁对象加读锁。
46.根据权利要求35所述的设备,其中,所述双路径访问包括文件、目录重命名或文件链接。
47.一种基于计算的设备,包括:
处理器;以及
被安排成存储计算机可执行指令的存储器,所述可执行指令在被执行时使所述处理器:
预先分配对应于目录树各层结点的读写锁对象,具体包括:
对于目录树的每一层,预先分配好固定数量个读写锁对象并放置于顺序锁表中,其中,所述顺序锁表中每一个读写锁对象对应于唯一对象下标,所述对象下标值的范围为[0,固定数量-1];将所有层的顺序锁表,按照层下标汇总到层顺序表中;
根据目录树操作,对操作路径中的各结点所对应的读写锁对象加读锁或写锁。
CN201610727980.4A 2016-08-26 2016-08-26 一种目录树的加锁方法及设备 Active CN107783988B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201610727980.4A CN107783988B (zh) 2016-08-26 2016-08-26 一种目录树的加锁方法及设备

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201610727980.4A CN107783988B (zh) 2016-08-26 2016-08-26 一种目录树的加锁方法及设备

Publications (2)

Publication Number Publication Date
CN107783988A CN107783988A (zh) 2018-03-09
CN107783988B true CN107783988B (zh) 2021-12-03

Family

ID=61439749

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201610727980.4A Active CN107783988B (zh) 2016-08-26 2016-08-26 一种目录树的加锁方法及设备

Country Status (1)

Country Link
CN (1) CN107783988B (zh)

Families Citing this family (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110018866B (zh) * 2018-11-06 2022-03-15 蔚来(安徽)控股有限公司 用户界面主题更新方法、装置、系统、车机及车辆
CN109543429A (zh) * 2018-11-21 2019-03-29 武汉思普崚技术有限公司 一种适用于期望链接的双链表保护方法及装置
CN110347650B (zh) * 2019-07-16 2021-06-01 北京明略软件系统有限公司 一种元数据采集方法及装置
CN110515909B (zh) * 2019-08-29 2022-05-13 北京字节跳动网络技术有限公司 文件存储方法、装置、电子设备及计算机存储介质
CN111352860B (zh) * 2019-12-26 2022-05-13 天津中科曙光存储科技有限公司 一种Linux Bcache中的垃圾回收方法及系统
CN111258957B (zh) * 2020-01-10 2023-06-02 北京百度网讯科技有限公司 分布式文件系统目录更新方法、装置、设备和介质
CN111597193B (zh) * 2020-04-28 2023-09-26 广东亿迅科技有限公司 一种树形数据的加解锁方法
CN113204435B (zh) * 2021-07-01 2021-12-03 阿里云计算有限公司 数据处理方法以及系统
CN114282074B (zh) * 2022-03-04 2022-08-16 阿里云计算有限公司 数据库操作方法、装置、设备及存储介质

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103150394A (zh) * 2013-03-25 2013-06-12 中国人民解放军国防科学技术大学 面向高性能计算的分布式文件系统元数据管理方法
CN103942269A (zh) * 2014-03-26 2014-07-23 北京京东尚科信息技术有限公司 对文件系统进行操作的方法和装置

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9720926B2 (en) * 2014-08-04 2017-08-01 Cohesity, Inc. Read operations in a tree-based distributed file system

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103150394A (zh) * 2013-03-25 2013-06-12 中国人民解放军国防科学技术大学 面向高性能计算的分布式文件系统元数据管理方法
CN103942269A (zh) * 2014-03-26 2014-07-23 北京京东尚科信息技术有限公司 对文件系统进行操作的方法和装置

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
linux线程同步之读写锁(rwlock);walker沃克;《https://blog.csdn.net/anonymalias/article/details/9174595》;20130626;第3页 *
临界区读写锁的实现;孙建杰等;《计算机与现代化》;20111231(第9期);第216-218页 *

Also Published As

Publication number Publication date
CN107783988A (zh) 2018-03-09

Similar Documents

Publication Publication Date Title
CN107783988B (zh) 一种目录树的加锁方法及设备
US11061928B2 (en) Snapshots and forks of storage systems using distributed consistent databases implemented within an object store
US11182356B2 (en) Indexing for evolving large-scale datasets in multi-master hybrid transactional and analytical processing systems
US10754878B2 (en) Distributed consistent database implementation within an object store
Thomson et al. {CalvinFS}: Consistent {WAN} Replication and Scalable Metadata Management for Distributed File Systems
US20050102255A1 (en) Computer-implemented system and method for handling stored data
US5261088A (en) Managing locality in space reuse in a shadow written B-tree via interior node free space list
CN109086388B (zh) 区块链数据存储方法、装置、设备及介质
CN109643309B (zh) 用于对跳跃表数据结构执行范围查询的系统和方法
US9922086B1 (en) Consistent query of local indexes
JPH0786843B2 (ja) データ構造更新方法
US10176205B2 (en) Using parallel insert sub-ranges to insert into a column store
US11210006B2 (en) Distributed scalable storage
US7941451B1 (en) Dynamic preconditioning of a B+ tree
GB2520361A (en) Method and system for a safe archiving of data
US11221777B2 (en) Storage system indexed using persistent metadata structures
US11216416B2 (en) Managing snapshotting of a dataset using an ordered set of B+ trees
US20110099347A1 (en) Managing allocation and deallocation of storage for data objects
JPH0358249A (ja) フアイルのアクセス方法
US7542983B1 (en) Delaying automated data page merging in a B+tree until after committing the transaction
Kalita et al. Durablefs: A file system for persistent memory
WO2015134677A1 (en) Snapshots and forks of storage systems using distributed consistent databases implemented within an object store
Adamanskiy et al. EJDB-Embedded JSON database engine
CN117076147B (zh) 死锁检测方法、装置、设备和存储介质
US20230195747A1 (en) Performant dropping of snapshots by linking converter streams

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant