哈希表修复方法及装置制造方法及图纸

技术编号:23432551 阅读:21 留言:0更新日期:2020-02-25 13:30
本申请提供一种哈希表修复方法及装置,涉及数据存储技术领域,用于减少哈希表的修复时间。该方法包括:在哈希表损坏后,从共享内存中恢复哈希表的结构,该哈希表的结构包括哈希表的属性区;从哈希表的属性区获取链表操作日志,链表操作日志包含哈希桶的标识;根据预设规则,修复目标双向链表,目标双向链表为在哈希表中根据哈希桶的标识确定的双向链表。本申请适用于哈希表的修复过程中。

Hash table repair method and device

【技术实现步骤摘要】
哈希表修复方法及装置
本申请涉及数据存储
,尤其涉及哈希表修复方法及装置。
技术介绍
元数据(Metadata),又称中介数据、中继数据,为描述数据的数据(dataaboutdata),主要是描述数据属性(property)的信息,用来支持如指示存储位置、历史数据、资源查找、文件记录等功能。当前,在存储设备中,元数据存储在共享内存中。存储设备以哈希表的形式管理各个存储着元数据的内存块的内存地址,以便于查找元数据。由于元数据的更改以及其他原因,存储设备的进程会修改哈希表。而修改哈希表的进程发生故障会导致哈希表的损坏。在哈希表损坏后,存储设备遍历所有存储着元数据的内存块,以修复哈希表。但是,由于存储着元数据的内存块数以亿计,即使采用并发的方式进行处理,存储设备仍然需要较长的时间才能修复哈希表。
技术实现思路
本申请提供一种哈希表修复方法及装置,用于减少哈希表的修复时间。为达到上述目的,本申请采用如下技术方案:第一方面,提供一种哈希表修复方法,包括:在哈希表损坏后,从共享内存中恢复哈希表的结构,哈希表的结构包括哈希表的属性区,哈希表的属性区用于存储链表操作日志,链表操作日志包含哈希桶的标识;从哈希表的属性区获取链表操作日志;根据预设规则,修复目标双向链表,目标双向链表为在哈希表中根据哈希桶的标识确定的双向链表。在存储设备中,进程修改哈希表,实际上是修改哈希表中的双向链表。因此,进程的故障实际上损坏的是哈希表中该进程正修改的双向链表。因此,在哈希表损坏后,存储设备从共享内存中恢复哈希表的结构,并从哈希表的属性区获取链表操作日志,从而根据链表操作日志包含的哈希桶的标识,确定哈希表中受进程故障而损坏的双向链表(也即目标双向链表)。从而,存储设备修复该目标双向链表,能够完成对哈希表的修复。由于在上述修复过程中,存储设备仅需要修复目标双向链表,因此存储设备至多需要遍历该目标双向链表相关的存储着元数据的内存块(也即目标双向链表的节点),而不需要遍历所有存储着元数据的内存块,从而减少哈希表的修复时间。一种可能的设计中,上述根据预设规则,修复目标双向链表,包括:从目标双向链表的头节点开始,遍历目标双向链表中的每一个节点;检测节点的后继节点的前向指针域是否存储节点的内存地址;若节点的后继节点的前向指针域未存储节点的内存地址,则在节点的后继节点的前向指针域中存储节点的内存地址。这样一来,存储设备通过遍历一遍目标双向链表的所有节点,能够完成对目标双向链表的修复。一种可能的设计中,链表操作日志还包含待操作节点的内存地址以及操作类型。上述根据预设规则,修复目标双向链表,包括:根据操作类型对应的规则,修复目标双向链表。这样一来,针对不同的操作类型,存储设备使用不同的规则,以实现对目标双向链表的精准修复。一种可能的设计中,若操作类型为插入节点操作,则上述根据操作类型对应的规则,修复目标双向链表,包括以下步骤:S701-S710。S701、检测待操作节点的后向指针域是否存储有内存地址;是,执行步骤S702。S702、根据待操作节点的后向指针域存储的内存地址,确定待操作节点的后继节点。S703、检测待操作节点的前向指针域是否存储有内存地址;否,执行步骤S704。S704、检测待操作节点的后继节点的前向指针域存储的内存地址是否与待操作节点的内存地址相同;是,执行步骤S705和步骤S710;否,执行步骤S706-S710。S705、从目标双向链表中查找到待操作节点的前驱节点。S706、根据待操作节点的后继节点的前向指针域存储的内存地址,确定待操作节点的前驱节点。S707、检测待操作节点的前驱节点的后向指针域存储的内存地址是否与待操作节点的内存地址相同;是,执行步骤S709-S710;否,执行步骤S708-S710。S708、在待操作节点的前驱节点的后向指针域中存储待操作节点的内存地址。S709、在待操作节点的后继节点的前向指针域中存储待操作节点的内存地址。S710、在待操作节点的前向指针域中存储待操作节点的前驱节点的内存地址。一种可能的设计中,若操作类型为删除节点操作,则上述根据操作类型对应的规则,修复目标双向链表,包括以下步骤:S801-S805。S801、根据待操作节点的后向指针域存储的内存地址,确定待操作节点的后继节点。S802、根据待操作节点的前向指针域存储的内存地址,确定待操作节点的前驱节点。S803、检测待操作节点的前驱节点的后向指针域存储的内存地址是否与待操作节点的后继节点的内存地址相同;是,执行步骤S804。S804、检测待操作节点的后继节点的前向指针域存储的内存地址是否与待操作节点的前驱节点的内存地址相同;否,执行步骤S805。S805、在待操作节点的后继节点的前向指针域中存储待操作节点的前驱节点的内存地址。一种可能的设计中,若操作类型为替换节点操作,则上述根据操作类型对应的规则,修复目标双向链表,包括以下步骤:S901-S910。S901、检测待操作节点的后向指针域是否存储有内存地址;是,执行步骤S902。S902、根据待操作节点的后向指针域存储的内存地址,确定待操作节点的后继节点。S903、检测待操作节点的后继节点的前向指针域存储的内存地址是否与待操作节点的内存地址相同;否,执行步骤S904。S904、根据待操作节点的后继节点的前向指针域存储的内存地址,确定被替换的节点。S905、根据被替换的节点的前向指针域存储的内存地址,确定待操作节点的前驱节点。S906、检测待操作节点的前驱节点的后向指针域存储的内存地址是否与待操作节点的内存地址相同;否,执行步骤S907;是,执行步骤S910。S907、检测待操作节点的前向指针域是否存储有待操作节点的前驱节点的内存地址;否,执行步骤S908-S910;是,执行步骤S09-S910。S908、在待操作节点的前向指针域中存储待操作节点的前驱节点的内存地址。S909、在待操作节点的前驱节点的后向指针域中存储待操作节点的内存地址。S910、在待操作节点的后继节点的前向指针域中存储待操作节点的内存地址。一种可能的设计中,在哈希表损坏之前,方法还包括:获取操作指令,操作指令用于指示修改哈希表中的目标双向链表;根据操作指令,生成链表操作日志;根据操作指令对应的预设操作流程,修改目标双向链表。该预设操作流程用于使目标双向链表在修改过程中保持单向连通性。也即,该预设操作流程用于使目标双向链表在修改过程中不会断裂。这样一来,一方面,存储设备在修改哈希表前,按照操作指令,生成链表操作日志,以记录本次的操作,从而在哈希表损坏后,存储设备可以根据链表操作日志,修复哈希表。另一方面,存储设备在修改哈希表时,按照所述操作指令对应的预设操作流程,修改目标双向链表,避免进程的故障导致目标双向链表断裂,从而便于后续对目标双向链表的修复。一种可能的设计中,若操本文档来自技高网...

【技术保护点】
1.一种哈希表修复方法,其特征在于,所述方法包括:/n在哈希表损坏后,从共享内存中恢复所述哈希表的结构,所述哈希表的结构包括所述哈希表的属性区,所述哈希表的属性区用于存储链表操作日志,所述链表操作日志包含哈希桶的标识;/n从所述哈希表的属性区获取链表操作日志;/n根据预设规则,修复目标双向链表,所述目标双向链表为在所述哈希表中根据所述哈希桶的标识确定的双向链表。/n

【技术特征摘要】
1.一种哈希表修复方法,其特征在于,所述方法包括:
在哈希表损坏后,从共享内存中恢复所述哈希表的结构,所述哈希表的结构包括所述哈希表的属性区,所述哈希表的属性区用于存储链表操作日志,所述链表操作日志包含哈希桶的标识;
从所述哈希表的属性区获取链表操作日志;
根据预设规则,修复目标双向链表,所述目标双向链表为在所述哈希表中根据所述哈希桶的标识确定的双向链表。


2.根据权利要求1所述的哈希表修复方法,其特征在于,所述根据预设规则,修复目标双向链表,包括:
从所述目标双向链表的头节点开始,遍历所述目标双向链表中的每一个节点;
检测节点的后继节点的前向指针域是否存储所述节点的内存地址;
若所述节点的后继节点的前向指针域未存储所述节点的内存地址,则在所述节点的后继节点的前向指针域中存储所述节点的内存地址。


3.根据权利要求1所述的哈希表修复方法,其特征在于,所述链表操作日志还包含待操作节点的内存地址以及操作类型;
所述根据预设规则,修复目标双向链表,包括:
根据所述操作类型对应的规则,修复所述目标双向链表。


4.根据权利要求3所述的哈希表修复方法,其特征在于,若所述操作类型为插入节点操作,则所述根据所述操作类型对应的规则,修复所述目标双向链表,包括以下步骤:
S701、检测所述待操作节点的后向指针域是否存储有内存地址;是,执行步骤S702;
S702、根据所述待操作节点的后向指针域存储的内存地址,确定所述待操作节点的后继节点;
S703、检测所述待操作节点的前向指针域是否存储有内存地址;否,执行步骤S704;
S704、检测所述待操作节点的后继节点的前向指针域存储的内存地址是否与所述待操作节点的内存地址相同;是,执行步骤S705和步骤S710;否,执行步骤S706-S710;
S705、从目标双向链表中查找到所述待操作节点的前驱节点;
S706、根据所述待操作节点的后继节点的前向指针域存储的内存地址,确定所述待操作节点的前驱节点;
S707、检测所述待操作节点的前驱节点的后向指针域存储的内存地址是否与所述待操作节点的内存地址相同;是,执行步骤S709-S710;否,执行步骤S708-S710;
S708、在所述待操作节点的前驱节点的后向指针域中存储所述待操作节点的内存地址;
S709、在所述待操作节点的后继节点的前向指针域中存储所述待操作节点的内存地址;
S710、在所述待操作节点的前向指针域中存储所述待操作节点的前驱节点的内存地址。


5.根据权利要求3所述的哈希表修复方法,其特征在于,若所述操作类型为删除节点操作,则所述根据所述操作类型对应的规则,修复所述目标双向链表,包括以下步骤:
S801、根据所述待操作节点的后向指针域存储的内存地址,确定所述待操作节点的后继节点;
S802、根据所述待操作节点的前向指针域存储的内存地址,确定所述待操作节点的前驱节点;
S803、检测所述待操作节点的前驱节点的后向指针域存储的内存地址是否与所述待操作节点的后继节点的内存地址相同;是,执行步骤S804;
S804、检测所述待操作节点的后继节点的前向指针域存储的内存地址是否与待操作节点的前驱节点的内存地址相同;否,执行步骤S805;
S805、在所述待操作节点的后继节点的前向指针域中存储所述待操作节点的前驱节点的内存地址。


6.根据权利要求3所述的哈希表修复方法,其特征在于,若所述操作类型为替换节点操作,则所述根据所述操作类型对应的规则,修复所述目标双向链表,包括以下步骤:
S901、检测所述待操作节点的后向指针域是否存储有内存地址;是,执行步骤S902;
S902、根据所述待操作节点的后向指针域存储的内存地址,确定所述待操作节点的后继节点;
S903、检测所述待操作节点的后继节点的前向指针域存储的内存地址是否与所述待操作节点的内存地址相同;否,执行步骤S904;
S904、根据所述待操作节点的后继节点的前向指针域存储的内存地址,确定被替换的节点;
S905、根据所述被替换的节点的前向指针域存储的内存地址,确定所述待操作节点的前驱节点;
S906、检测所述待操作节点的前驱节点的后向指针域存储的内存地址是否与所述待操作节点的内存地址相同;否,执行步骤S907;是,执行步骤S910;
S907、检测所述待操作节点的前向指针域是否存储有所述待操作节点的前驱节点的内存地址;否,执行步骤S908-S910;是,执行步骤S09-S910;
S908、在所述待操作节点的前向指针域中存储所述待操作节点的前驱节点的内存地址;
S909、在所述待操作节点的前驱节点的后向指针域中存储所述待操作节点的内存地址;
S910、在所述待操作节点的后继节点的前向指针域中存储所述待操作节点的内存地址。


7.根据权利要求1至6任一项所述的哈希表修复方法,其特征在于,在哈希表损坏之前,所述方法还包括:
获取操作指令,所述操作指令用于指示修改所述哈希表中的目标双向链表;
根据所述操作指令,生成所述链表操作日志;
根据所述操作指令对应的预设操作流程,修改所述目标双向链表。


8.根据权利要求7所述的哈希表修复方法,其特征在于,若所述操作指令用于指示在所述目标双向链表的第一节点之后插入待操作节点,则根据所述操作指令对应的预设操作流程,修改所述目标双向链表,包括以下步骤:
在所述待操作节点的后向指针域中存储第二节点的内存地址,所述第二节点为所述第一节点在所述目标双向链表中的后继节点;
在所述第一节点的后向指针域中存储所述待操作节点的内存地址;
在所述第二节点的前向指针域中存储所述待操作节点的内存地址;
在所述待操作节点的前向指针域中存储所述第一节点的内存地址。


9.根据权利要求7所述的哈希表修复方法,其特征在于,若所述操作指令用于指示从所述目标双向链表中删除待操作节点,则根据所述操作指令对应的预设操作流程,修改所述目标双向链表,包括以下步骤:
在第三节点的后向指针域中存储第四节点的内存地址;其中,所述第三节点为所述待操作节点在所述目标双向链表中的前驱节点;所述第四节点为所述待操作节点在所述目标双向链表中的后继节点;
在所述第四节点的前向指针域中存储所述第三节点的内存地址。


10.根据权利要求7所述的哈希表修复方法,其特征在于,若所述操作指令用于指示以待操作节点替换所述目标双向链表中的第五节点,则根据所述操作指令对应的预设操作流程,修改所述目标双向链表,包括以下步骤:
在所述待操作节点的后向指针域中存储第七节点的内存地址,所述第七节点为所述第五节点在所述目标双向链表中的后继节点;
在所述待操作节点的前向指针域中存储第六节点的内存地址,所述第六节点为所述第五节点在所述目标双向链表中的前驱节点;
在所述第六节点的后向指针域中存储所述待操作节点的内存地址;
在所述第七节点的前向指针域中存储所述待操作节点的内存地址。


11.一种存储设备,其特...

【专利技术属性】
技术研发人员:裴旭黄勇辉
申请(专利权)人:成都华为技术有限公司
类型:发明
国别省市:四川;51

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1