【技术实现步骤摘要】
哈希表修复方法及装置
本申请涉及数据存储
,尤其涉及哈希表修复方法及装置。
技术介绍
元数据(Metadata),又称中介数据、中继数据,为描述数据的数据(dataaboutdata),主要是描述数据属性(property)的信息,用来支持如指示存储位置、历史数据、资源查找、文件记录等功能。当前,在存储设备中,元数据存储在共享内存中。存储设备以哈希表的形式管理各个存储着元数据的内存块的内存地址,以便于查找元数据。由于元数据的更改以及其他原因,存储设备的进程会修改哈希表。而修改哈希表的进程发生故障会导致哈希表的损坏。在哈希表损坏后,存储设备遍历所有存储着元数据的内存块,以修复哈希表。但是,由于存储着元数据的内存块数以亿计,即使采用并发的方式进行处理,存储设备仍然需要较长的时间才能修复哈希表。
技术实现思路
本申请提供一种哈希表修复方法及装置,用于减少哈希表的修复时间。为达到上述目的,本申请采用如下技术方案:第一方面,提供一种哈希表修复方法,包括:在哈希表损坏后,从共享内存中恢复哈希表的结构,哈希表的结构包括哈希表的属性区,哈希表的属性区用于存储链表操作日志,链表操作日志包含哈希桶的标识;从哈希表的属性区获取链表操作日志;根据预设规则,修复目标双向链表,目标双向链表为在哈希表中根据哈希桶的标识确定的双向链表。在存储设备中,进程修改哈希表,实际上是修改哈希表中的双向链表。因此,进程的故障实际上损坏的是哈希表中该进程正修改的双向链表。因此,在哈希表损坏后,存储设备从共 ...
【技术保护点】
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
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。