包括键值存储装置的机器和操作键值存储装置的方法与流程

文档序号:25542450发布日期:2021-06-18 20:39阅读:59来源:国知局
包括键值存储装置的机器和操作键值存储装置的方法与流程

发明构思总体上涉及存储装置,更具体地,涉及可以处理块请求的键值(key-value,kv)存储装置。



背景技术:

键值固态驱动器(kv-ssd)可以为存储和访问数据提供一种可选方式。基于非kv的存储装置可以提供逻辑块地址(lba),固态驱动器(ssd)将逻辑块地址映射到装置上的物理块地址(pba)。在使用kv-ssd的情况下,主机可以将键分配给数据。在提供了键相对于kv-ssd上的其他键具有唯一性的情况下,数据可以存储在kv-ssd上。这使得针对kv-ssd的指令集减少:通常,指令可以包括用于存储与键相关联的值的命令(放置(put))、取得与键相关联的值的命令(获取(get))和删除与键相关联的值的命令(删除(delete))(具体的命令名称可以变化)。

然而,尽管kv-ssd在它们的操作方面具有优点,但许多应用仍使用块命令对存储装置读取和写入数据。目前,kv-ssd无法处理这样的块命令。

对kv-ssd(和其他kv存储装置)而言,有处理块请求的需求。



技术实现要素:

发明构思的一些实施例提供了一种包括键值(kv)存储装置的机器,其中,kv存储装置包括:存储设备,用于第一对象和第二对象,第一对象包括与第一键相关联的第一数据,并且第二对象包括与第二键相关联的第二数据;kv转换层,用于将第一键转换为存储设备中的存储第一数据的第一物理地址,并且将第二键转换为存储设备中的存储第二数据的第二物理地址;kv接口,用于接收涉及第一对象的第一kv请求;块接口,用于接收涉及第二对象的块请求;以及块仿真器,用于从块请求生成包括第二键的第二kv请求。

发明构思的一些实施例提供了一种方法包括:在用于kv存储装置的块接口仿真器处接收来自源的块请求;确定对kv存储装置的一组kv请求,以仿真接收的块请求;对kv存储装置执行所述一组kv请求,以生成结果;以及将结果从kv存储装置返回给源。

发明构思的一些实施例提供了一种包括非暂时性存储介质的产品,其中,非暂时性存储介质具有存储在非暂时性存储介质上的指令,所述指令被机器执行时,使得:在用于键值(kv)存储装置的块接口仿真器处接收来自源的块请求;确定对kv存储装置的一组kv请求,以仿真接收的块请求;对kv存储装置执行所述一组kv请求,以生成结果;以及将结果从kv存储装置返回给源。

附图说明

图1示出了根据发明构思的实施例的包括能够处理块请求的键值固态驱动器(kv-ssd)的系统。

图2示出了图1的系统的附加细节。

图3示出了图1的kv-ssd的细节。

图4a至图4b示出了根据发明构思的实施例的用于实现图3的块仿真器的各种布局。

图5示出了图3的将块请求转换为键值请求的块仿真器。

图6示出了根据发明构思的实施例的图3的块仿真器的一些附加细节。

图7示出了根据发明构思的实施例的存储在图3的元数据存储设备中的元数据的一些细节。

图8示出了根据发明构思的一个实施例的与块写入请求的处理相关联的一些示例操作。

图9示出了根据发明构思的一个实施例的与块读取请求的处理相关联的一些示例操作。

图10示出了根据发明构思的一个实施例的与块修剪请求的处理相关联的一些示例操作。

图11示出了根据发明构思的另一实施例的与块写入请求的处理相关联的一些示例操作。

图12示出了与图5的元数据的响应于图11的块写入请求的更新相关联的一些示例操作。

图13示出了根据发明构思的另一实施例的与第二块写入请求的处理相关联的一些示例操作。

图14示出了与图5的元数据的响应于图13的块写入请求的第二更新相关联的一些示例操作。

图15示出了根据发明构思的另一实施例的与块读取请求的处理相关联的一些示例操作。

图16示出了根据发明构思的另一实施例的与块修剪请求的处理相关联的一些示例操作。

图17示出了与图5的元数据的响应于图16的块修剪请求的更新相关联的一些示例操作。

图18示出了根据发明构思的实施例的用于使用图1的kv-ssd处理块请求的示例过程的流程图。

图19a至图19b示出了根据发明构思的实施例的用于使用图1的kv-ssd处理块写入请求的示例过程的流程图。

图20a至图20b示出了根据发明构思的实施例的用于在使用图1的kv-ssd处理块写入请求时更新元数据的示例过程的流程图。

图21a至图21c示出了根据发明构思的实施例的用于使用图1的kv-ssd处理块读取请求的示例过程的流程图。

图22a至图22c示出了根据发明构思的实施例的用于使用图1的kv-ssd处理块修剪请求的示例过程的流程图。

具体实施方式

现在将对发明的实施例做出详细参照,在附图中示出了发明的实施例的示例。在下面的详细描述中,多个特定细节被阐述,以使对发明的彻底理解成为可能。然而,应理解的是,本领域普通技术人员可以在没有这些特定细节的情况下实践发明。在其他情况下,公知的方法、过程、组件、电路和网络未被详细描述,以免不必要地模糊实施例的方面。

将理解的是,尽管在这里可以使用术语第一、第二等来描述各种元件,但这些元件不应受这些术语限制。这些术语仅用于将一个元件与另一元件区分开。例如,第一模块可以被称为第二模块,相似地,在不脱离发明的范围的情况下,第二模块可以被称为第一模块。

在发明的描述中使用的术语这里仅出于描述具体实施例的目的,而不意图成为发明的限制。如在发明的描述和所附权利要求中使用的,除非上下文另外清楚地指示,否则单数形式也意图包括复数形式。还将理解的是,如在这里使用的术语“和/或”是指并涵盖相关所列项中的一个或多个的任何和所有可能的组合。还将理解的是,术语“包括”和/或“包含”用在本说明书中时,说明存在所陈述的特征、整体、步骤、操作、元件和/或组件,但不排除存在或添加一个或多个其他特征、整体、步骤、操作、元件、组件和/或它们的组。附图的组件和特征不必按比例绘制。

通过为kv-ssd引入接收块命令并将那些命令转换为键值命令的能力,kv-ssd可以由使用块命令的现有应用访问,而无需重新编程或重新编译应用,并且无需引入供应用使用的块接口存储装置。

存在kv-ssd可以被增强为提供块接口仿真的至少两种方式。在发明构思的一个实施例中,ssd可以包括外部块接口和键值(kv)接口,并且具有物理地位于块接口与kv闪存转换层之间的块仿真器。在发明构思的另一实施例中,在主机上运行的装置驱动器可以从应用接收块请求并将那些块请求转换为kv请求,然后,kv请求可以被提供到kv-ssd上的kv接口。

尝试用kv命令来仿真块命令的一个问题会是命令的直接映射(写入到放置(put)、读取到获取(get),修剪到删除(delete))无法工作。例如,可能发生其中写入请求将数据存储在特定lba处而提供的lba被用作kv-ssd上的键的情况。如果不存在具有该键的对象,则写入命令到放置命令的简单转换可以工作。然而,如果kv-ssd已经存储具有该键的对象,则放置命令会返回错误。

该问题会由于写入命令可以跨越多个lba的事实而复杂化:即使包括针对写入命令的基地址的lba不被用作键,数据也仍然与存储在另一对象中的数据重叠。例如,考虑块在大小上为大约4kb且应用先前已经将数据写入开始于地址0x2000的lba的情况。对开始于地址0x1000的数据的写入命令不会出现,就好像该写入命令覆写了已经在kv-ssd上的任何数据一样。然而,如果写入命令包括大于大约4kb的数据,那么先前写入地址0x2000处的数据的至少一部分会被覆写,但该事实可能无法使用命令的直接映射被检测。

相似地,即使存储在lba处的数据先前已经被无效,对块接口存储装置的读取请求也会工作。块接口存储装置会简单地读取存储在对应的pba处的任何数据:该数据可能适合于或可能不适合于应用。然而,针对不存在的键而发送到kv-ssd的获取命令会返回错误。

修剪命令会导致相似的问题。如果修剪命令可以用于删除仅作为先前写入的lba范围的一部分的数据,则kv-ssd会尝试删除不存在的对象(因为不会存在具有该lba作为键的对象)。这也会导致kv-ssd返回错误。

因此,块接口仿真器可能需要执行除了基于命令的名称来映射命令之外的附加操作。具体地,块接口仿真器可以用于检查lba范围是否与存储针对其他lba的数据的现有对象重叠,并且可以确定如何处理这样的事件。此外,如果存在重叠,则现有对象可以通过这样的写入命令或修剪命令而被部分地或完全地修改。

注意的是,kv-ssd的块接口仿真的预期行为可以与基于块的存储装置相似。在给定“块”的初始布置的情况下,“块”的相同或相似布置可以在任何操作之后存在,但具有适当的数据修改。因此,例如,可以存在这样的情况,在该情况中,“对象1”可以包括写入lba0至lba3的数据,“对象3”可以包括写入lba4至lba5的数据,“对象2”可以包括写入lba7至lba14的数据。如果新数据被接收以被存储在lba2至lba7处,则这会部分地覆写“对象1”和“对象2”中的数据(并且完全覆写“对象3”中的数据),产生这样的布置:“对象1”包括写入lba0至lba1的数据,“对象4”包括写入lba2至lba7的新数据,并且“对象2”包括写入lba8至lba14的数据。然后,如果读取命令被发送以读取lba6至lba8处的数据,则该数据可以从“对象4”和“对象2”被提取并返回。

发明构思的所描述的实施例的一些非限制性优点可以包括支持kv接口和块接口两者的单个装置,而不是针对每种类型的接口使用单独的装置。此外,块接口仿真器可以提供增加的安全性。因为针对不存储数据的lba(即,针对不具有对应的对象的lba)的读取命令可以通过kv-ssd返回错误被检测,所以能够通过检测未授权的读取和块访问来增强安全性:kv-ssd可以随后进行锁定,以防止入侵者从kv-ssd访问有效数据。

存在可以用于实现发明构思的实施例的各种算法。一种这样的算法可以被称为“拆分-合并(split-merge)”算法,另一种这样的算法可以被称为“区间树(intervaltree)”算法。

在使用“拆分-合并”算法的情况下,每个lba可以被存储为单独的对象。每个对象的键可以与lba相关。例如,实际的lba可以用作键,或者键可以(例如,使用有可能避免哈希碰撞的哈希函数)从lba被生成。在使用“区间树”算法的情况下,元数据可以用于存储哪些lba与对象相关联。在发明构思的这样的实施例中,键可以以任何适合的方式被生成(因为键不必与被数据跨越的lba相关)。

例如,描述了跨越lba2至lba7的块写入命令被接收的情况。根据使用的算法,存在发明构思的实施例可以在其中操作的至少两种变型。

在“拆分-合并”算法中,每个lba与单独的块相关联。因此,当用于将数据写入lba2至lba7的块写入命令被接收时,该块写入命令被拆分为各自与不同的键相关联的六个不同的放置命令。在数据已经存在之处(例如,在lba2至lba5和lba7中),那些对象可以用存储新数据的新对象被替代,并且旧数据丢失。

在“区间树”算法中,元数据可以用于存储哪些lba与不同的对象相关联。因此,元数据可以指示“对象1”包括跨越lba0至lba3的数据,“对象2”包括跨越lba7至lba13的数据,并且“对象3”包括跨越lba4至lba5的数据。在这种实施例中,“对象4”可以与指示数据跨越lba2至lba7的元数据一起被添加。“对象1”可以被修改以删除先前与lba2至lba3相关联的数据,“对象2”可以被修改以删除先前与lba7相关联的数据。这样的修改可以以任何适合的方式实现。例如,如果kv-ssd支持可以从对象的一端或另一端修剪数据的命令,则这样的命令可以被使用。可选地,对象可以被读取,被内部地修改以消除不需要的数据,然后作为具有同一键的更新的对象被重新写入。此外,在一些示例中,“对象3”可以被删除。

描述了请求lba6至lba8中的数据的块读取命令被接收的情况。如果“拆分-合并”算法被使用,则每个lba被存储为单独的对象,那些对象可以被读取,并且数据被合并。如果“区间树”算法被使用,则对象可以存储多个lba,然后,元数据可以用于确定哪些对象存储数据。继续上面的示例,元数据可以指示“对象4”包括lba2至lba7(因此包括请求的lba中的两个),并且“对象2”包括lba8至lba13(因此包括请求的lba中的一个)。然后,“对象4”和“对象2”可以被读取,数据从那些对象中的值被提取,然后该数据被合并以经由块接口仿真器被返回给应用。

还可以描述块修剪命令被接收的情况,块修剪命令请求删除lba2至lba7中的数据。如果“拆分-合并”算法被使用,那么块修剪命令可以被拆分为独立的删除命令(每个lba一个删除命令)。另一方面,如果“区间树”算法被使用,那么元数据可以用于确定哪些对象受块修剪命令影响。如所指出的,在块修剪命令被接收时,“对象1”包括跨越lba0至lba3的数据,“对象2”包括跨越lba7至lba13的数据,“对象3”包括跨越lba4至lba5的数据。因此,修剪命令涉及删除“对象1”中的数据的尾端、“对象2”中的数据的头部以及“对象3”的全部。与块写入命令一样,“对象1”可以被修改以删除先前与lba2至lba3相关联的数据,“对象2”可以被修改以删除先前与lba7相关量的数据。这样的修改可以以任何适合的方式实现。例如,如果kv-ssd支持可以从对象的一端或另一端修剪数据的命令,则这样的命令可以被使用。可选地,对象可以被读取,被内部地修改以消除不需要的数据,然后作为具有同一键的更新的对象被重新写入。在一些示例中,“对象3”可以被删除。

尽管结合使用用于识别哪些对象存储与哪些lba范围相关联的数据的表描述了上面的描述,但公开的系统可以使用其他实施方式。例如,公开的系统可以实施区间树来管理元数据信息。树结构可以用于具有顺序写入的工作负载(诸如,日志)。

在发明构思的一些实施例中,公开的系统可以创建混合模型,在该混合模型中,存储为独立的块(或小的块范围)的区间树和lba两者被使用。例如,默认结构可以为使用区间树。然后,如果节点变得被充分地片段化(fragment)(即,片段(fragmentation)超过阈值,或者节点中的lba的数量下降到特定阈值以下),则上述拆分-合并方法可以用于分段的节点中的数据。当然,如果先前分段的节点用足够大的顺序数据被再次覆写,那么该节点可以返回到区间树。

如在这里描述的发明构思的实施例的一些优点可以包括但不限于公开的系统,该公开的系统被配置为支持预命名空间配置(per-namespaceconfiguration)、用户定义的键大小(例如,大约4字节)、用户定义的块大小(例如,大约512字节、大约4kb、大约8kb、大约16kb、大约32kb等)以及用户定义的排序或原子性(其可以遵循目标装置协议(诸如,at附件(ata)、串行连接小型计算机系统接口(scsi)(sas)和非易失性存储器高速(nvme)等)的语义)。

支持在这里描述的操作的组件可以包括但不限于在下面进一步描述的拆分器、合并器和批量命令处理器(用于发出适合于仿真的多个kv命令)。在一些示例中,拆分器可以将大的数据拆分为一系列固定大小的块,生成对块进行映射的一系列键,用一系列(键、块)操作来创建用于放置的批量操作,发出批量放置,并且在处理完成时用第一键将完成返回给用户。合并器可以将小块合并为大的数据,生成用于取得块的一系列键,用适当的键来创建用于获取的批量操作,发出批量获取,并且在处理完成时将取得的块合并为一个大的块并将完成与第一键返回给用户。

各种修剪语义可以被支持。这些修剪语义可以包括:非确定性修剪(non-deterministictrim)(对lba的每个读取命令可以在修剪之后返回不同的数据)、确定性修剪(deterministictrim,drat)(对lba的所有读取命令在修剪之后应返回相同的数据或变得确定)以及修剪之后的确定性读取零(deterministicreadzeroaftertrim,rzat)(对lba的所有读取命令在修剪之后应返回零)。

图1示出了根据发明构思的实施例的包括被配置为处理块请求的键值固态驱动器(kv-ssd)的机器。在图1中,示出了机器105。机器105可以包括处理器110。处理器110可以是任何种类的处理器。尽管图1示出了机器105中的单个处理器110,但机器105可以包括任何数量的处理器,任何数量的处理器中的每个可以是单核处理器或多核处理器,并可以以任何适合的组合进行混合。

机器105还可以包括存储器115。存储器115可以是任何种类的存储器(诸如,闪存、动态随机存取存储器(dram)、静态随机存取存储器(sram)、持久性随机存取存储器、铁电随机存取存储器(fram)或非易失性随机存取存储器(nvram)(诸如,磁阻随机存取存储器(mram))等)。存储器115还可以是不同存储器类型的任何适合的组合。机器105还可以包括可用于管理对存储器115的访问的存储器控制器120。

机器105可以包括键值存储装置125(被示出为键值固态驱动器(kv-ssd))。kv-ssd125可以使用键值接口来访问数据,应用或操作系统可以向kv-ssd125提供键(诸如,对象135的键130),然后,kv-ssd125可以将该键映射到kv-ssd125上的位置。然后,kv-ssd125可以访问并返回存储在kv-ssd125上的该位置处的值(被示出为对象135的数据140)。与由存储装置上的一些文件系统提供的相对复杂的命令集不同,kv-ssd125可以提供简化的命令集,诸如:获取(get)(用于取得与提供的键相关联的值)、放置(put)(用于将提供的值存储在kv-ssd上,提供的值与提供的键或与kv-ssd生成的键相关联,kv-ssd生成的键可以被返回)以及擦除(erase)(用于删除与从kv-ssd提供的键相关联的值,并且从kv-ssd表移除键值关联)。kv-ssd125还可以支持其他命令,并且可以使用与示出的命令名称不同的命令名称,但原理总体上如所描述的一样。kv-ssd125还可以用支持如下面在发明构思的实施例中描述的对象存储的任何其他存储装置被替代。

处理器110可以运行可支持对kv-ssd125的访问的装置驱动器145。尽管图1将kv存储装置125具体地示出为kv-ssd,但发明构思的实施例可以扩展至任何类型的kv存储装置,而与其底层硬件或存储机制无关。

尽管图1将机器105描绘为服务器(其可以是独立服务器或机架式服务器),但发明构思的实施例可以包括任何类型的机器105,而没有限制。例如,机器105可以用台式计算机或膝上型计算机或可从发明构思的实施例受益的任何其他机器被替代。机器105还可以包括专用便携式计算机器、平板计算机、智能电话和其他计算机器。此外,可以从kv-ssd125访问数据的应用可以位于另一机器中,所述另一机器与机器105分离并经由穿越任何类型(有线、无线、全球等)的一个或多个网络的网络连接来访问机器105。

图2示出了图1的机器105的附加细节。在图2中,通常,机器105包括可包含存储器控制器120和时钟205的一个或多个处理器110,时钟205可以用于协调机器105的组件的操作。处理器110还可以结合到存储器115,作为示例,存储器115可以包括随机存取存储器(ram)、只读存储器(rom)或其他状态保持介质。处理器110还可以结合到存储装置125并结合到网络连接器210,网络连接器210可以是例如以太网连接器或无线连接器。处理器110还可以连接到总线215,用户接口220和输入/输出接口端口以及其他组件可以附接到总线215,输入/输出接口端口可以使用输入/输出引擎225被管理。

图3示出了图1的kv-ssd的细节。在图3中,kv-ssd125可以包括主机接口逻辑(hil)305、ssd控制器310和各种闪存芯片315-1至315-8(也称为“闪存存储设备”),闪存芯片315-1至315-8可以被组织为各种通道320-1至320-4。主机接口逻辑305可以管理kv-ssd125与其他组件(诸如,图1的处理器110)之间的通信。主机接口逻辑305还可以管理与远离kv-ssd125的装置(即,可以不被认为是机器105的一部分但(例如,通过一种或多种网络连接)与kv-ssd125通信的装置)的通信。这些通信可以包括用于从kv-ssd125读取数据的读取请求、用于将数据写入kv-ssd125的写入请求和用于从kv-ssd125删除数据的删除请求。主机接口逻辑305可以管理仅横跨单个端口的接口,或者它可以管理横跨多个端口的接口。可选地,kv-ssd125可以包括多个端口,多个端口中的每个可以具有单独的主机接口逻辑305以管理横跨该端口的接口。公开的系统还可以包括发明构思的以上实施例的混合(例如,具有三个端口的ssd可以具有管理一个端口的一个主机接口逻辑和管理其他两个端口的第二主机接口逻辑)。

ssd控制器310可以使用闪存控制器(图3中未示出)来管理闪存芯片315-1至315-8上的读取操作和写入操作以及垃圾收集操作和其他操作。

在基于块的存储装置(具体地,基于块的ssd)中,主机可以将逻辑块地址(lba)分配给数据,存储装置可以将逻辑块地址(lba)映射到物理块地址(pba)。存储装置可以维持这些映射的记录,从而使ssd和主机免于必须确保主机在数据的当前pba上保持最新。主机可以使用lba;存储装置将lba映射到pba并返回适当的信息。如果(如在例如ssd上的数据覆写或垃圾收集期间会发生的)数据被内部地移动到存储装置,则会在不通知主机的情况下发生这样的数据移动(伴随着用数据的新pba来更新映射)。可以将lba映射到pba的这样的结构可以被称为转换层(或者,具体地,在ssd和使用闪存的其他装置的背景下被称为闪存转换层)。

相反,如上面讨论的,kv-ssd可以与基于块的存储装置不同地管理数据。数据(其可以被称为值或数据值)可以被分配键(其可以被称为对象键),而不是数据被分配lba。除了术语改变(“对象键”替代“lba”)之外,对象键与lba之间(以及kv-ssd与基于块的ssd之间)可以存在其他差异。基于块的ssd中的块的大小会在制造时被固定。例如,在具有大约4kb的块的基于块的ssd中,每个块在大小上为大约4kb:会没有灵活性。该事实意味着lba也被划分为大约4kb的单元以有效地映射到ssd上的块。另一方面,kv-ssd可以允许数据值的灵活大小。例如,为了指定一些可能的大小,对象可以以诸如大约512b、大约4kb、大约8kb、大约16kb和大约32kb的大小为单位被存储。此外,数据值大小还可以随着可能改变排序和/或原子性而改变(例如,从大约4b到大约255b)。例如,kv-ssd可以使用诸如ata、sas、nvme等的协议。与可以由基于块的ssd提供的布置相比,这些布置在如何存储数据上允许更大的灵活性。

因此,kv-ssd125可以包括从对象键到存储数据值的地址的映射(诸如,转换层325),而不是闪存转换层。转换层325可以从对象键映射到在kv-ssd125上存储对应的数据的地址。转换层325还可以存储附加数据。例如,附加数据涉及对象有多大(并因此涉及整个对象可以如何存储在kv-ssd125上)。

最后,为了支持块请求的处理,主机接口逻辑305可以包括块仿真器330和/或元数据存储设备335。块仿真器330可以使用kv存储装置语义来仿真块请求的处理。元数据存储设备335可以用于存储与块请求相关的元数据。下面参照图12进一步讨论可以作为元数据被存储在元数据存储设备335中的信息。尽管图3将主机接口逻辑305示出为包括块仿真器330和元数据存储设备335,但发明构思的各种实施例可以包括kv-ssd125的将这些元件设置在kv-ssd125内的其他地方的不同配置。例如,块仿真器330和/或元数据存储设备335可以被设置在ssd控制器310内或在图1的装置驱动器145内被管理。

尽管图3将kv-ssd125示出为包括被组织为四条通道320-1至320-4的八个闪存芯片315-1至315-8,但发明构思的实施例可以支持被组织为任何数量的通道的任何数量的闪存芯片。相似地,尽管图3示出了kv-ssd的结构,但其他存储装置(例如,硬盘驱动器)可以使用不同的但具有相似的潜在益处的结构来实现,以包括安全性和数据去重(datadeduplication)两者。

图4a至图4b示出了根据发明构思的实施例的kv-ssd125以及装置驱动器145-1和145-2的各种布局。在图4a中,kv-ssd125被示出为包括闪存芯片315、转换层325和块仿真器330(并且还包括尽管在图4a中未示出的图3的元数据存储设备335)。kv-ssd125还可以包括用于接收kv请求的kv接口405和用于接收块请求的块接口410。kv接口405和块接口410可以分别与kv装置驱动器145-1和块装置驱动器145-2通信,kv装置驱动器145-1和块装置驱动器145-2可以分别包括用于从图1的处理器110(以及在处理器110中执行的任何软件)接收请求的接口415和420。注意的是,经由kv接口405接收的请求可以绕过块仿真器330而直接进行处理。

另一方面,在图4b中,kv-ssd125被示出为常规kv-ssd。与图4a相比,在图4b中,kv-ssd125可以省略块仿真器330和块接口410。代替地,块装置驱动器145-2可以包括块仿真器330(并且还包括尽管在图4b中未示出的图3的元数据存储设备335),以处理对经由接口(例如,块接口)420从图1的处理器110(以及在处理器110中执行的任何软件)接收的块请求的仿真。kv装置驱动器145-1和块装置驱动器145-2两者可以向kv接口405发出kv请求以由kv-ssd125进行处理。

图5示出了图3的将块请求转换为键值请求的块仿真器330。在图5中,块仿真器330可以接收块请求505。在下面描述的发明构思的实施例中,块请求505可以是写入请求、读取请求或修剪(删除)请求,但块请求505还可以包括其他块请求。响应于接收块请求505,块仿真器330可以生成一组kv请求510,一组kv请求510中的每个可以包括键(或称为kv键)130(当然,不同的请求可以包括不同的键)。尽管在图5中未示出,但根据所生成的具体的kv请求510,kv请求510还可以包括将要写入图1的kv-ssd125的数据。

键130可以使用任何适合的方法被生成。例如,lba可以在未修改的情况下被用作对象的键。或者,lba可以被哈希化(或被另外地操作)以生成键130。在一些示例中,键130可以用存储在某处的将特定lba映射到特定键的表被随机地生成或分配。

单个块请求505可以导致多个kv请求510的一个原因可以是基于发送块请求的方式。尽管对于将要写入存储装置、从存储装置读取或删除的数据的量会有实际限制(例如,存储装置的物理容量限制),但对于在单个块请求中能够写入、读取或删除多少数据可以没有另外的实际限制。

例如,可以存在每个块(如由图1的处理器110或在其上执行的任何应用预期的一样)在大小上为大约4kb的情况。块请求505可以请求将一些量的数据写入例如lba0x1000。如果将要写入的该一些量的数据在大小上实际为大约8kb,则该一些量的数据可以在基于块的存储装置上跨越两个块:地址0x1000处的块和地址0x2000处的块。相似地,跨越多于两个块的较大量的数据也可以由图1的处理器110写入。基于块的存储装置可以处理这样的请求。

块仿真器330的一种直接实现方式可以是基于写入请求中提供的lba将键分配给数据。因此,kv请求510可以使用键0x1000来存储大约8kb的数据。

当图1的处理器110发出影响在该请求中被写入但写入与lba0x1000不同的块中的一些数据的请求时,此方法会发生一个问题。例如,考虑会发生图1的处理器110发出请求以读取lba0x2000处的数据的情况。基于块的存储装置可以处理这样的请求:存储在指定lba处的任何数据可以被读取并返回给图1的处理器110。然而,当块仿真器330尝试确定与lba0x2000相关联的键时,这样的键可能无法被找到(因为具有该特定lba的块请求尚未由图1的kv-ssd125接收),块仿真器330会返回错误。如果图1的处理器110尝试将“新”数据写入lba0x2000,则该问题会恶化。块仿真器330将把该块写入请求视为将数据存储在之前尚未被写入的lba处。因此,图1的kv-ssd125最终会将针对lba0x2000的数据存储在两个不同对象中:在针对lba0x1000的对象(第一块写入请求)中存储一次,并且在针对lba0x2000的对象中存储一次。因此,从图1的kv-ssd125返回什么数据会取决于哪个lba在块读取请求中被请求和多少数据将被读取。此外,会发生其中针对同一lba的数据会存储三次或更多次(利用不同的lba被写入)的情况:从理论上讲,在被提供有为每个块写入请求提供的不同的lba的情况下,图1的kv-ssd125最终会将针对“同一”lba的任何数量的不同数据存储在不同对象中。

发明构思的实施例包括用于在图1的kv-ssd125上存储数据的两种不同的方法,其避免了上述问题。下面参照图8至图10讨论的一种这样的方法可以被称为“拆分-合并”方法;下面参照图11至图17讨论的另一种方法使用元数据来管理数据重叠,并且可以被称为区间树方法。

在拆分-合并方法中,单个块请求505(例如,单个块写入请求)可以被拆分为多个kv写入请求,多个kv写入请求中的每个针对不同的lba。也就是说,如果块请求505跨越多个不同的块,则块仿真器330可以将请求拆分为多个单独的kv写入请求,多个单独的kv写入请求中的每个可以用于对不同的块写入数据。(注意的是,多少kv写入请求被生成可以取决于在块写入请求中写入的数据的大小和独立块的大小两者,独立块的大小可以是用户定义的,甚至可以针对不同的用户或不同的应用而变化。)相似地,可跨越多个块的块读取请求可以被拆分为多个不同的kv读取请求,针对每个受影响的块有一个kv读取请求,在此之后,来自独立kv读取请求的数据可以被合并以生成块读取请求的结果。(同样,不同的kv读取请求的数量可以取决于将要读取的数据的量和独立块的定义大小。)块修剪请求也可以导致多个kv删除请求(再次,取决于将要删除的数据的量和独立块的定义大小)。

在使用拆分-合并方法的情况下,可以将涉及n个块的给定块操作划分为n个kv操作(其中,n是大于1的整数),然后将结果合并在一起。当工作负载涉及许多小的随机写入时(即,在给定事务历史的情况下,对于接下来将请求什么lba而言几乎没有模式,并且每个事务倾向于一次涉及不超过几个块),拆分-合并方法可以很好地工作。然而,一些工作负载可能无法满足这些条件。

区间树方法可以针对涉及顺序写入的工作负载(诸如,日志)而工作。单个对象可以存储多个对象的数据,而不是将每个块存储为单独的对象。区间树可以用于跟踪哪些对象包括哪些块的数据。然后,区间树可以用于确定特定块操作是否涉及与现有对象的任何重叠:然后,那些对象可以按照需要被识别和处理。

例如,为了处理块写入请求,可以存在至少两种可能性。在第一种情况下,新lba可以不与已经存储在图1的kv-ssd125上的任何现有块重叠;在另一种情况下,可以存在一些重叠。如果不存在重叠,那么可以将新数据存储在具有新选择的键的对象中,并且将新节点插入区间树中。如果存在一些重叠,那么可以更新与新地址范围重叠的现有对象以消除重叠地址,并且可以更新区间树以反映对图1的kv-ssd125上的对象的更新。此时,可以不存在与任何现有对象的重叠,因此可以将新对象添加到图1的kv-ssd125,并且将新节点添加到区间树。

为了处理块读取请求或块修剪请求,区间树可以被搜索以定位与被请求的地址范围重叠的所有对象。那些对象可以被读取或删除;如果那些对象被读取,则数据可以(在仅对象的一部分被需要的情况下)被解析,然后,不与被请求的地址范围重叠的对象的数据和被解析的数据可以被返回给请求者。

注意的是,如果区间树不包括针对块读取请求或块修剪请求的指定地址范围内的所有块,则块仿真器330可以返回错误。该行为可以与基于块的存储装置不同(基于块的存储装置甚至可以从当前不存储数据的块读取数据):而该行为改变可以被认为是安全性增强。例如,入侵者可能正在探测图1的kv-ssd125,以确定什么数据在图1的kv-ssd125上被找到。如果接收的非适当地形成的块读取请求的数量超过阈值(即,太多的块读取请求从当前不存储数据的块请求数据),那么块仿真器330可以触发kv-ssd125的锁定,以防止入侵者进一步尝试从图1的kv-ssd125访问数据。(还注意的是,该阈值数量的不适当块请求可能超过图1的kv-ssd125的寿命,或者其可以在阈值时间量期间:例如,超过最近的5分钟)。该锁定可以持续预定时间量(例如,10分钟),在该预定时间量期间,图1的kv-ssd125可以不处理仅来自入侵者或来自任何用户的请求,或者锁定可以持续直到管理员解锁图1的kv-ssd125以允许图1的kv-ssd125再次处理请求为止。

注意的是,尽管上面讨论的数据结构可以被称为区间树,但该数据结构可以采用任何适合的形式。例如,元数据可以存储在阵列(array,或“数组”)或链表而不是树结构中。即使作为树结构,变型也是可行的:例如,树可以是平衡的或不平衡的(平衡树可以是这样的树:对于树中的任何节点,左分支距该节点的深度可以不比右分支距该节点的深度多一个或少一个)。还注意的是,在给定对区间树执行的操作的情况下,更具体的区间树可以被使用。例如,对于任何给定的块地址,区间树可以包括包含该块地址的不多于一个的节点。因此,尽管一般的区间树能够识别包括特定地址的任何数量的区间,但发明构思的实施例中使用的区间树可以不需要处理这种更一般的问题。也就是说,所讨论的区间树可以不需要识别与任何特定块地址重叠的多于一个的区间。下面参照图7、图12和图17进一步讨论元数据的结构。

当数据被写入图1的kv-ssd125时,节点可以被插入区间树中。当数据从图1的kv-ssd125被删除时,节点可以从区间树被移除。下面参照图12和图17进一步讨论如何执行这些操作。

图6示出了根据发明构思的实施例的图3的块仿真器330的细节。如图6中所示,块仿真器330可以包括拆分器605和合并器610。如上面讨论的,在发明构思的一些实施例中,图5的单个块请求505可以导致图5的多个kv请求510,受图5的块请求505影响的每个lba一个kv请求510。拆分器605可以生成对块请求中涉及的块的kv请求,合并器610可以将那些独立操作的结果组合为单个结果。(批量处理器在图6中未被示出,其可以管理由拆分器605生成的所有独立kv请求的批量测量操作。)可选地,拆分器605可以生成一个或多个kv请求,但一个或多个kv请求的数量不必为与块请求中涉及的块的数量相同。例如,在区间树方法中,单个块请求(无论是块写入请求,块读取请求,还是块修剪请求)可以涉及一个或多个kv写入请求(在任何对象正在被修改以删除它们的头部数据或尾部数据中的一些的情况下)、一个或多个kv读取请求(用于读取正在被修改的对象)以及一个或多个kv删除请求(用于删除正在被完全覆写的对象)。拆分器605可以负责生成这些不同的kv请求,合并器610负责组合任何结果以传递回块请求的请求者。

图7示出了根据发明构思的实施例的存储在图3的元数据存储设备335中的元数据的细节。在图7中,示出了示例区间树。在该示例区间树中,示出了代表三个对象的三个节点。节点705可以代表被识别为对象4的对象(其可以是用于从图1的kv-ssd125访问对象的键,或者相关联的键可以存储在除了对象标识符之外或替代对象标识符的节点705中),对象4可以被示出为存储跨越块4至块6的数据。节点710可以代表被识别为对象0的对象,对象0可以被示出为存储跨越块0至块3的数据。节点715可以代表被识别为对象7的对象,对象7可以被示出为存储跨越块7至块15的数据。注意的是,图7中示出的示例区间树可以是平衡树,但如上面讨论的,不平衡树、另一类型的树或另一数据结构可以用于存储相同的信息。

在图8至图10中,示出了发明构思的实施例,在发明构思的实施例中,每个块(如在附图中示出的lba1至lba15)可以作为单独的对象(如在附图中示出的对象1至对象15(“o1”至“o15”))存储在图1的kv-ssd125上。图8示出了根据发明构思的一个实施例的块写入请求的示例处理。在图8中,示出了请求将数据写入块2至块7的块写入请求805。块仿真器330(更具体地,图6的拆分器605)可以将块写入请求805拆分为如由kv放置请求810示出的六个独立的kv放置请求,块2至块7中的每个块一个kv放置请求。然后,如上面参照图6讨论的,kv放置请求810可以使用批量处理器被处理。

注意的是,如原始数据815中所示,数据已经存储在“块”0至“块”5以及“块”7至“块”15中。六个kv放置请求的结果最终覆写“块”2至“块”5以及“块”7中的数据(如由原始数据815中的这些对象的交叉阴影线所示)。执行六个kv放置请求的结果可以被示出在修改数据820中。

图9示出了根据发明构思的一个实施例的块读取请求的示例处理。继续来自图8的示例,在图9中,示出了修改数据820,并且将块仿真器330示出为:接收块读取请求905,从“块”6至“块”8请求数据。块仿真器330(更具体地,图6的拆分器605)可以将块读取请求905拆分为如由kv获取请求910示出的三个kv获取请求。然后,如上面参照图6讨论的,kv获取请求910可以使用批量处理器被处理。一旦数据可以使用kv获取请求910从各个对象被读取,图6的合并器610就可以将数据合并在一起,以产生由块读取请求905请求的数据915。

图10示出了根据发明构思的一个实施例的块修剪请求的示例处理。继续来自图8至图9的示例,在图10中,示出了修改数据820,并且将块仿真器330示出为:接收块修剪请求1005,请求删除“块”6至“块”8中的数据。块仿真器330(更具体地,图6的拆分器605)可以将块修剪请求1005拆分为如由kv删除请求1010示出的三个kv删除请求。然后,如上面参照图6讨论的,kv删除请求1010可以使用批量处理器被处理。一旦代表“块”6至“块”8的对象被删除(由修改数据820中的交叉阴影线表示),结果就可以是第二修改数据1015。

在图11至图17中,示出了发明构思的实施例,在该实施例中,区间树可以用于跟踪哪些对象存储图1的kv-ssd125上的哪些“块”。图11示出了根据发明构思的另一实施例的块写入请求805的示例处理。图11的块写入请求805可以与图8的块写入请求805相同。

当接收块写入请求805时,块仿真器330可以检查图3的元数据存储设备335中的元数据(诸如,区间树),以确定哪些对象受块写入请求805影响。如在原始数据1135(某些对象与上面参照图7的区间树讨论的对象对应)中可以看到的,在原始数据1135中可以存在受块写入请求805影响的三个对象(在以上图7的区间树中或在原始数据1135中可以存在未示出的附加对象,未示出的附加对象可以不影响块写入请求805的操作)。对象0(用竖直阴影线标记示出)可以使其数据中的在该对象的尾部处的一些数据被覆写,对象4(用交叉阴影线示出)可以被完全覆写,对象7(用水平阴影线标记示出)可以使其数据中的在该对象的头部处的一些数据被覆写。注意的是,通常,尽管任何数量的(零个或多个)对象可以被完全覆写(并因此遭到删除),并且任何数量的(零个或多个)对象可以完全不受块写入请求805影响,但不多于两个的对象可以使它们的数据被部分覆写(潜在地,一个对象受块写入请求805的开始影响,并且潜在地,一个对象受块写入请求805的结束影响)。

一旦受影响的对象已经被识别,块仿真器330就可以生成适当的kv请求以相应地改变数据。因为对象0(1105)可以在其尾部处丢失一些数据,所以对象0(1105)可以被读取(例如,被读取到图1的kv-ssd125内的存储器中),适当的数据可以从对象0的原始数据1105被删除(在这种情况下,删除的数据代表原始的“块”2至“块”3),新对象(1110)(因对象中的数据的原始lba未被改变而具有同一键,并且仍可以被识别为对象0)可以被写入图1的kv-ssd125。可选地,如果kv-ssd125支持可以简单地删除数据的在对象的尾部处的部分的请求(与块修剪请求相似),则这样的请求可以替代地被使用。

因为对象7(1115)可以在其头部处丢失一些数据,所以对象7(1115)可以被读取(同样,例如,被读取到图1的kv-ssd125内的存储器中),适当的数据可以从对象7的原始数据1115被删除(在这种情况下,删除的数据代表原始的“块”7),剩余数据可以被写回到图1的kv-ssd125中。然而,因为对象7(1115)可以在其头部处丢失一些数据,所以代表对象7(1115)的第一块的lba可以随数据删除的结果而变化。因此,对象7(1115)的修改版本可以使用新对象键被写回到图1的kv-ssd125作为新对象(1120)(现在可以被识别为对象8),原始的对象7(1115)可以被删除。可选地,如果kv-ssd125支持可以删除数据的在对象的头部处的部分(同样与块修剪请求相似)和/或改变与对象相关联的键的请求,则这样的请求可以替代地被使用。

对象4(1125)可以被块写入请求805中的数据完全覆写。因此,块仿真器330可以简单地生成kv删除请求,以从图1的kv-ssd125删除对象4(1125)。

最后,块仿真器330可以生成kv放置请求,以将对象2(1130)(具有新数据)写入图1的kv-ssd125。原始数据1135和修改数据1140可以示出由所有这些操作造成的改变。

图12示出了图5的元数据的响应于图11的块写入请求805的更新。在图12的左侧,示出了原始的元数据。如上面讨论的,对象0(1105)可以在其尾部处丢失两个“块”的数据,对象7(1115)可以在其头部处丢失一个“块”的数据,对象4(1125)可以被完全删除,新对象2(1130)可以被添加。因此,节点710可以被修改以将对象0的范围从跨越块0至块3改变为跨越块0至块1(如由节点1205所示),节点715可以被修改以将对象7的范围从跨越块7至块15改变为跨越块8至块15,并使对象标识符被改变为对象8(如由节点1210所示),节点705可以被删除(因为对象4(1125)可以正在从图1的kv-ssd125被删除),节点1215(代表新对象2(1130))可被添加。

尽管在许多情况下,将要写入的数据会在对象的头部或尾部处与该对象重叠(特别是在多于一个对象受影响的情况下),但存在另一种可能性:将被覆写的数据可能在单个对象的中间。例如,考虑继续图11的示例的图13。在图13中,块写入请求1305可以被接收,并且覆写“块”4至“块”5中的数据。因为“块”4至“块”5完全在对象2(1130)内,所以在对象2(1130)内存在可以被覆写的数据以及可以保持不变的数据。一种可能性可以是:从图1的kv-ssd125读取对象2(1130)(例如,将对象2(1130)从kv-ssd125读取到图1的kv-ssd125内的本地存储器中),修改在对象2(1130)的中间的数据,然后将对象2(1130)写回到图1的kv-ssd125。该方法可以避免对更新图3的元数据存储设备335中的元数据的需要。然而,如图13中所示,存在另一种方法。

块仿真器330可以从kv-ssd125读取对象2(1130),并且可以将对象2(1130)划分为三个部分:一个部分包含(未修改的)头部数据(在图13中示出的示例中,该头部部分可以包括“块”2至“块”3),一个部分包含(未修改的)尾部数据(在图13中示出的示例中,该尾部部分可以包括“块”6至“块”7),一个部分包含修改的数据(在图13中示出的示例中,该部分可以包括“块”4至“块”5)。未修改的头部部分和尾部部分可以被存储为它们自身的的对象(被示出为第二修改数据1320中的对象2(1310)和对象6(1315)),修改的数据可以被写入为它自身的对象(被示出为第二修改数据1320中的对象4(1325))。

尽管两种方法都潜在地涉及从图1的kv-ssd125读取被修改的对象,并且将该对象(以及潜在的其他对象)写回到图1的kv-ssd125,但第二种方法具有优点:当正在从对象的中间删除数据时也可以使用该方法(可以完全省略包含修改数据的对象,恰好代替写入该对象)。如果数据可以从对象的中间被删除,则第一种方法将在数据中留下“洞”(不存储任何数据的两个“块”)。

图14示出了图5的元数据的响应于图13的块写入请求1305的更新。在图14的左侧,可以示出修改之前的元数据。如上面讨论的,对象2(1130)(如由节点1215所示)可以被划分为三个部分,所述三个部分包括对象2(1130)的前两个“块”、将要写入图1的kv-ssd125的新数据和对象2(1130)的最后两个“块”;对象0(1110)(如由节点1205所示)和对象8(1120)(如由节点1210所示)可以不受图13的块写入请求1305影响。因此,节点1215可以被修改以将对象2的范围从跨越块2至块7改变为跨越块2至块3(如由节点1405所示),节点1410(代表对象4(1325))和节点1415(代表对象6(1315))可以被添加到元数据。(图14中的右侧示出的区间树具有不同布置的节点,以示出平衡区间树;其他的平衡树节点布置也可以是可行的;如果区间树不是平衡树,则其他的树节点布置也仍可以是可行的,如果另一数据结构被使用,则元数据的布置可以不同。)

图15示出了根据发明构思的另一实施例的块读取请求905的示例处理。图15的块读取请求905可以与图9的块读取请求905相同。

当接收块读取请求905时,块仿真器330可以从图3的元数据存储设备335访问元数据,以识别受影响的对象。如在修改数据1140中可以看到的,“块”6至“块”8可以在对象2(1130)和对象8(1120)中被找到。因此,块仿真器330(更具体地,图6的拆分器605)可以发出kv获取请求,以读取对象2(1130)和对象8(1120)。然后,块仿真器330可以处理读取的数据,以从对象2(1130)提取“块”6至“块”7(如由对象2(1505)所示),并且从对象8(1120)提取“块”8(如由对象8(1510)所示)。然后,图6的合并器610可以合并结果数据以产生数据915,然后,数据915可以被发送回图1的处理器110(或在处理器110中执行的发出块读取请求905的任何软件)。

图16示出了根据发明构思的另一实施例的块修剪请求1005的示例处理。图16的块修剪请求1005可以与图10的块修剪请求1005相同。

当接收块修剪请求1005时,块仿真器330可以从图3的元数据存储设备335访问元数据,以识别受影响的对象。如在修改数据1140中可以看到的,“块”6至“块”8可以在对象2(1130)和对象8(1120)中被找到。因此,块仿真器330(更具体地,图6的拆分器605)可以发出请求,以读取对象2(1130)和对象8(1120)(例如,将对象2(1130)和对象8(1120)读取到图1的kv-ssd125的存储器中)。然后,来自对象2(1130)的代表“块”6至“块”7的数据和来自对象8(1120)的代表“块”8的数据可以从对象被移除,包括剩余数据的对象可以被写回到图1的kv-ssd125。注意的是,因为对象8(1120)可以在其头部处丢失数据,所以代表对象8(1120)的头部处的“块”的lba可以被改变,因此,该对象可以被分配新标识符(和/或新键)。修改的对象可以被示出为对象2(1605)和对象9(1610)。对象2(1130)和对象8(1120)可以与如上面参照图11讨论的对象0(1105)和对象7(1115)如何被修改相似地被修改,并且如果图1的kv-ssd125支持可以直接修改对象而无需读取它们,修改本地副本并将结果写回到图1的kv-ssd125的请求,则这样的请求可以替代地被使用。一旦代表“块”6至“块”8的对象已经被删除,结果就可以是第二修改数据1615。

图17示出了图5的元数据的响应于图16的块修剪请求1005的更新。在图17的左侧,可以示出原始的元数据,并且在图17的右侧,可以示出修改的元数据。如上面讨论的,对象2(1130)可以在其尾部处丢失两个“块”的数据,对象8(1120)可以在其头部处丢失一个“块”的数据。因此,节点1215可以被修改以将对象2的范围从跨越块2至块7改变为跨越块2至块5(如由节点1705所示),节点1210可以被修改以将对象8的范围从跨越块8至块15改变为跨越块9至块15(并且可以使对象标识符被改变为对象9(如由节点1710所示))。对象0(1110)可以不受图16的块修剪请求1005影响,因此,节点1205可以在区间树中不变。

图18示出了根据发明构思的实施例的用于使用图1的kv-ssd125处理块请求的示例过程的流程图。在图18中,在框1805处,图1的kv-ssd125可以从图1的处理器110(或在处理器110上执行的软件)接收图5的块请求505。在框1810处,图3的块仿真器330可以基于图5的块请求505确定图5的一组(一个或多个)kv请求510。在框1815处,图1的kv-ssd125可以执行图5的一组kv请求510,在框1820处,图1的kv-ssd125可以向请求者返回结果(诸如,请求被完成的确认、读取请求所请求的数据或者错误(在执行请求时存在问题的情况下)。

图19a至图19b示出了根据发明构思的实施例的用于使用图1的kv-ssd125处理图8和图11的块写入请求805的示例过程的流程图。如可以看到的,对于处理图8和图11的块写入请求805,存在至少两条可行的路径。根据一条路径(拆分-合并方法),在图19a中,在框1905处,图6的拆分器605可以将图8的块写入请求805拆分为图8的kv写入请求(即,kv放置请求)810(受图8的块写入请求805影响的每个“块”一个这样的kv写入请求),在框1910处,图1的kv-ssd125可以执行图8的kv写入请求810中的每个。

可选地,根据另一条路径(区间树方法),在框1915处,图3的块仿真器330可以识别通过图11的块写入请求805(部分地或完全地)而被重叠的对象。在框1920处,图3的块仿真器330可以生成kv请求,以删除通过图11的块写入请求805而被完全地重叠的对象(该kv请求可以由图1的kv-ssd125执行):将要移除的对象的键可以在图3的元数据存储设备335中的元数据中被找到。在框1925(图19b)处,图3的块仿真器330可以生成kv请求,以从通过图11的块写入请求805而被部分地重叠的对象移除重叠数据(该kv请求可以由图1的kv-ssd125执行):与框1920一样,这些对象的键可以在图3的元数据存储设备335中的元数据中被找到。在框1930处,图3的块仿真器330可以针对将要写入图1的kv-ssd125的新数据生成图1的键130。在框1935处,图3的块仿真器330可以生成kv请求以将新对象(具有图1的键130)写入图1的kv-ssd125(该kv请求可以由图1的kv-ssd125执行)。最后,在框1940处,图3的块仿真器330可以更新图3的元数据存储设备335中的元数据,以反映由框1920、框1925和框1935中的kv请求实现的改变。

图20a至图20b示出了根据发明构思的实施例的用于在使用图1的kv-ssd125处理图11的块写入请求805时更新元数据的示例过程的流程图。在图20a中,在框2005处,图3的块仿真器330可以从图1的kv-ssd125读取对象:将要读取的对象的键可以在图3的元数据存储设备335中的元数据中被找到。在框2010处,图3的块仿真器330可以确定数据是否正在从对象的头部或尾部被移除:也就是说,被重叠的数据是否可以在对象的开始或结束处。

如果正在移除的数据可以在对象的头部,那么在框2015(图20b)处,将要移除的数据可以从自对象读取的数据被修剪。在框2020处,原始的对象可以从图1的kv-ssd125被删除:因为对象的头部处的“块”的数据已经从对象被移除,所以代表该对象中的数据的开始的lba将改变,这意味着对象的键也将改变。在框2025处,图3的块仿真器330可以针对用于存储修剪数据的对象生成图1的新键130。最后,在框2030处,图3的块仿真器330可以发出kv请求,以将具有图1的新键130的新对象写入图1的kv-ssd125(然后,图1的kv-ssd125可以执行该kv请求)。

可选地,如果将要从对象修剪的数据可以在对象的尾部处,那么在框2035处,图3的块仿真器330可以从对象的尾部移除数据,在框2040处,图3的块仿真器330可以发出kv请求以将修改数据写回到对象。

如上面参照图13至图14讨论的,还可以存在于对象的中间修改数据的情况。在这种情况下,框2015至框2030以及框2035至框2040中示出的序列可以被修改和组合以实现结果。例如,(未修改的)尾部数据可以与数据中的其余数据分离并作为它自身的对象被写入(与针对框2015以及框2025至框2030所描述的相似),(未修改的)头部数据可以被保留为原始对象(并且其他的数据可以如框2035至框2040中一样作为不需要的尾部数据被删除),然后,包含新修改的数据的新对象可以被写入(如图19b的框1935中一样)。

图21a至图21c示出了根据发明构思的实施例的用于使用图1的kv-ssd125处理图9和图15的块读取请求905的示例过程的流程图。在图21a中,在框2105处,图3的块仿真器330可以检查以查看被请求的数据是否存在于图1的kv-ssd125上。注意的是,该检查可以不被需要:如果一些数据当前可能未存储在图1的kv-ssd125上,则图3的块仿真器330可以用任何适合的值(诸如,全零、全一或随机数据)来填充“缺失”数据。框2105示出的检查的益处在于其通过在有人尝试读取实际上不存在于图1的kv-ssd125上的数据时进行检测,来实现增强的安全性:然后,图1的kv-ssd125可以被锁定以防止这样的访问。注意的是,该检查可以被完成而无需实际访问图1的kv-ssd125上的对象:该检查可以通过从图3的元数据存储设备335访问元数据被执行。

如果所有请求的数据存在于图1的kv-ssd125上,那么如图21b中可以看到的,对于处理图9和图15的块读取请求905,存在至少两条可行的路径。根据一条路径(拆分-合并方法),在框2110(图21b)处,图6的拆分器605可以将图9的块读取请求905拆分为图9的kv读取请求(即,kv获取请求)910(受图9的块读取请求905影响的每个“块”一个这样的kv读取请求)。在框2115处,图1的kv-ssd125可以执行图9的kv读取请求910中的每个。最后,在框2120处,图6的合并器610可以合并由图9的kv读取请求910读取的数据,以产生可以返回给请求者的结果。

可选地,根据另一条路径(区间树方法),在框2125处,图3的块仿真器330可以识别通过图15的块读取请求905而被(部分地或完全地)重叠的对象。在框2130处,图3的块仿真器330可以生成kv请求以读取通过图15的块读取请求905而被部分地或完全地重叠的对象(该kv请求可以由图1的kv-ssd125执行):将要读取的对象的键可以在图3的元数据存储设备335中的元数据中被找到。然后,在框2120处,图6的合并器610可以(如上面一样)合并从重叠的对象读取的数据,以产生可以返回给请求者的结果。

如果并非所有请求的数据存在于图1的kv-ssd125上,那么在框2135(图21c)处,图3的块仿真器330可以检查以查看阈值数量的不适当请求是否已经被接收。注意的是,框2135中的检查可以测量自图1的kv-ssd125首次上电(或上次上电)以来的不适当请求的数量,或者框2135中的检查可以测量阈值时间间隔(例如,过去的五分钟)内的不适当请求的数量。如果不适当询问(请求)的阈值数量已经被满足,那么在框2140处,图3的块仿真器330可以锁定图1的kv-ssd125。在框2145处,图3的块仿真器330可以在阈值时间量(例如,五分钟)已经过去之后解锁图1的kv-ssd125。可选地,在框2150处,图1的kv-ssd125可以保持锁定,直到管理员解锁图1的kv-ssd125为止。

图22a至图22c示出了根据发明构思的实施例的用于使用图1的kv-ssd125处理图10和图16的块修剪请求1005的示例过程的流程图。在图22a中,在框2205处,图3的块仿真器330可以检查以查看将要删除的数据是否存在于图1的kv-ssd125上。注意的是,该检查可以不被需要:如果数据当前未存储在图1的kv-ssd125上,则图3的块仿真器330可以简单地“跳过”删除不在图1的kv-ssd125上的“块”。框2205中示出的检查的益处在于其通过在有人尝试删除实际上不存在于图1的kv-ssd125上的数据时进行检测来使增强的安全性成为可能:然后,图1的kv-ssd125可以被锁定以防止这样的访问。注意的是,该检查可以被完成而无需实际访问图1的kv-ssd125上的对象:该检查可以通过从图3的元数据存储设备335访问元数据被执行。

如果所有目标数据存在于图1的kv-ssd125上,那么如在图22b中可以看到的,对于处理图10和图16的块修剪请求1005,存在至少两条可行的路径。根据一条路径(拆分-合并方法),在框2210(图22b)处,图6的拆分器605可以将图10的块修剪请求1005拆分为图10的kv删除请求1010(受图10的块修剪请求1005影响的每个“块”一个这样的kv删除请求)。在框2215处,图1的kv-ssd125可以执行图10的kv删除请求1010中的每个。

可选地,根据另一条路径(区间树方法),在框2220处,图3的块仿真器330可以识别通过图16的块修剪请求1005而被(部分地或完全地)重叠的对象。在框2225处,图3的块仿真器330可以生成kv删除请求,以从通过图16的块修剪请求1005而被部分地或完全地重叠的对象删除数据(该请求可以由图1的kv-ssd125执行):将要移除的对象的键可以在图3的元数据存储设备335中的元数据中被找到。注意的是,框2225与框1925相似,并且用于完成框2225的方法被示出在图20a至图20b中。

如果并非所有将要删除的数据存在于图1的kv-ssd125上,那么在框2230(图22c)处,图3的块仿真器330可以检查以查看阈值数量的不适当请求是否已经被接收。注意的是,框2230中的检查可以测量自图1的kv-ssd125首次上电(或上次上电)以来的不适当请求的数量,或者框2230中的检查可以测量阈值时间间隔(例如,过去的五分钟)内的不适当请求的数量。如果不适当询问(请求)的阈值数量已经被满足,那么在框2235处,图3的块仿真器330可以锁定图1的kv-ssd125。在框2240处,图3的块仿真器330可以在阈值时间量(例如,五分钟)已经过去之后解锁图1的kv-ssd125。可选地,在框2245处,图1的kv-ssd125可以保持锁定,直到管理员解锁图1的kv-ssd125为止。

如上面参照图13至图14讨论的,还可以存在从对象的中间删除数据的情况。在这种情况下,框2210至框2215以及框2220至框2225中示出的序列可以被修改或组合以实现结果。例如,(未修改的)尾部数据可以与数据中的其余数据分离并被写入为它自身的对象(与针对框2220至框2225所描述的相似),(未修改的)头部数据可以被保留为原始对象(并且其他的数据可以如框2220至框2225中一样作为不需要的尾部数据被删除)。

在图18至图22c中,示出了发明的一些实施例。然而,本领域技术人员将认识到的是,通过改变框的顺序、通过省略框或通过包括附图中未示出的链接,发明的其他实施例也是可行的。无论是否被明确地描述,流程图的所有这样的变型都被认为是发明的实施例。

发明构思的实施例包括超越常规存储装置的技术优点。通过包括块仿真器,kv存储装置能够处理块请求。这样的配置使软件(诸如,操作系统、文件系统和应用)能够从kv存储装置访问数据,而不必被重新设计为生成kv请求。此外,因为块仿真器可以检测用于读取或删除实际上未存储在kv存储装置上的数据的请求,所以kv存储装置安全性被增强:kv存储装置可以被锁定以防止有人不适当地访问数据。

下面的讨论意图提供对其中可以实现发明的特定方面的一个或多个适合的机器的简要的、总体的描述。一个或多个机器可以至少部分地通过来自常规输入装置(诸如,键盘、鼠标等)的输入以及通过从另一机器接收的指令、与虚拟现实(vr)环境的交互、生物特征反馈或其他输入信号被控制。如在这里使用的,术语“机器”意图广泛地涵盖单个机器、虚拟机器或者通信地结合且一起操作的机器、虚拟机器或装置的系统。示例性的机器包括计算装置(诸如,个人计算机、工作站、服务器、便携式计算机、手持式装置、电话、平板电脑等)以及诸如私人或公共运输的运输装置(例如,汽车、火车、出租车等)。

一个或多个机器可以包括嵌入式控制器(诸如,可编程或不可编程逻辑装置或阵列、专用集成电路(asic)、嵌入式计算机、智能卡等)。一个或多个机器可以利用到一个或多个远程机器的一个或多个连接,诸如,通过网络接口、调制解调器或其他通信耦合。机器可以通过物理和/或逻辑网络(诸如,内联网、互联网、局域网、广域网等)的方式互连。本领域技术人员将理解的是,网络通信可以利用包括射频(rf)、卫星、微波、电气和电子工程师协会(ieee)802.11、光学、红外、电缆、激光等的各种有线和/或无线、短程或长程载波和协议。

本发明的实施例可以通过参照或结合包括函数、过程、数据结构、应用程序等的相关联的数据被描述,相关联的数据在被机器访问时使机器执行任务或者定义抽象数据类型或低级硬件上下文。例如,相关联的数据可以存储在易失性和/或非易失性存储器(例如,ram、rom等)中,或者存储在其他存储装置及其相关联的存储介质(包括硬盘驱动器、软盘、光学存储设备、磁带、闪存、记忆棒、数字视频盘、生物存储设备等)中。相关联的数据可以以分组(包)、串行数据、并行数据、传播信号等的形式在传输环境(包括物理和/或逻辑网络)上传送,并且可以以压缩或加密格式被使用。相关联的数据可以在分布式环境中被使用,并且被本地和/或远程地存储以用于机器访问。

发明的实施例可以包括有形的、非暂时性的机器可读介质,有形的、非暂时性的机器可读介质包括能够由一个或多个处理器执行的指令,所述指令包括用于执行如在这里描述的发明的元件的指令。

已经参照示出的实施例描述和示出了发明的原理,将认识到的是,示出的实施例可以在不脱离这样的原理的情况下在布置和细节上被修改,并且可以以任何期望的方式进行组合。尽管前述讨论已经集中在特定实施例上,但其他配置(构造)是预期的。具体地,尽管在这里使用了诸如“根据发明的实施例”等的表述,但这些短语意意味着总体上涉及实施例可能性,而不意图将发明限制为特定实施例配置。如在这里使用的,这些术语可以涉及可组合到其他实施例中的相同或不同的实施例。

前述的说明性实施例将不被解释为限制其发明。尽管已描述了一些实施例,但本领域技术人员将容易理解的是,在实质上不脱离本公开的新颖教导和优点的情况下,许多修改对那些实施例而言是可行的。因此,所有这样的修改意图被包括在如在权利要求中限定的本发明的范围内。

发明的实施例可以扩展至下面的声明,而没有限制:

声明1、发明构思的实施例包括一种键值(kv)存储装置,所述键值(kv)存储装置包括:

存储设备,用于第一对象和第二对象,第一对象包括与第一键相关联的第一数据,并且第二对象包括与第二键相关联的第二数据;

kv转换层,用于将第一键转换为存储设备中的存储第一数据的第一物理地址,并且将第二键转换为存储设备中的存储第二数据的第二物理地址;

kv接口,用于接收涉及第一对象的第一kv请求;

块接口,用于接收涉及第二对象的块请求;以及

块仿真器,用于生成第二kv请求,第二kv请求包括从块请求生成的第二键。

声明2、发明构思的实施例包括根据声明1所述的kv存储装置,所述kv存储装置还包括:

机器,包括kv存储装置;以及

处理器,执行用于所述kv存储装置的块装置驱动器,块装置驱动器包括所述块接口和所述块仿真器。

声明3、发明构思的实施例包括根据声明1所述的kv存储装置,所述kv装置还包括主机接口逻辑,主机接口逻辑包括所述块仿真器。

声明4、发明构思的实施例包括根据声明1所述的kv存储装置,其中,块仿真器至少部分地基于包括块写入请求的块请求生成至少一个kv写入请求。

声明5、发明构思的实施例包括根据声明4所述的kv存储装置,其中,块仿真器还至少部分地基于块写入请求生成至少一个kv删除请求。

声明6、发明构思的实施例包括根据声明4所述的kv存储装置,其中,块仿真器还至少部分地基于块写入请求生成至少一个kv读取请求。

声明7、发明构思的实施例包括根据声明1所述的kv存储装置,其中,块仿真器至少部分地基于包括块读取请求的块请求生成至少一个kv读取请求。

声明8、发明构思的实施例包括根据声明1所述的kv存储装置,其中,块仿真器至少部分地基于包括块修剪请求的块请求生成至少一个kv删除请求。

声明9、发明构思的实施例包括根据声明8所述的kv存储装置,其中,块仿真器还至少部分地基于块修剪请求生成至少一个kv读取请求和至少一个kv写入请求。

声明10、发明构思的实施例包括根据声明1所述的kv存储装置,其中,块仿真器包括:

拆分器,用于将块请求拆分为至少两个块请求;以及

合并器,用于将所述至少两个块请求的结果合并为单个结果。

声明11、发明构思的实施例包括根据声明1所述的kv存储装置,所述kv存储装置还包括用于关于第二对象的元数据的元数据存储设备。

声明12、发明构思的实施例包括根据声明1所述的kv存储装置,其中,如果阈值数量的请求导致错误,则块仿真器锁定kv存储装置。

声明13、发明构思的实施例包括根据声明12所述的kv存储装置,其中,如果阈值数量的请求在第一阈值时间量内导致错误,则块仿真器锁定kv存储装置。

声明14、发明构思的实施例包括根据声明12所述的kv存储装置,其中,块仿真器在第二阈值时间量之后解锁kv存储装置。

声明15、发明构思的实施例包括根据声明12所述的kv存储装置,其中,管理员解锁kv存储装置。

声明16、发明构思的实施例包括根据声明1所述的kv存储装置,其中,与块请求相关联的块大小能够被用户配置。

声明17、发明构思的实施例包括根据声明1所述的kv存储装置,其中,kv存储装置包括kv固态驱动器(kv-ssd)。

声明18、发明构思的实施例包括一种方法,所述方法包括:

在用于键值(kv)存储装置的块接口仿真器处接收来自源的块请求;

确定对kv存储装置的一组kv请求,以对接收的块请求进行仿真;

对kv存储装置执行所述一组kv请求,以生成结果;以及

将结果从kv存储装置返回给源。

声明19、发明构思的实施例包括根据声明18所述的方法,其中,块请求包括块写入请求、块读取请求和块修剪请求中的一者。

声明20、发明构思的实施例包括根据声明18所述的方法,其中:

在用于键值(kv)存储装置的块接口仿真器处接收来自源的块请求的步骤包括:在用于kv存储装置的块接口仿真器处接收来自源的块写入请求,块写入请求包括逻辑块地址(lba)和数据;以及

对kv存储装置执行所述一组kv请求的步骤包括:执行kv写入请求以将对象存储在kv存储装置上,对象包括与键相关联的数据。

声明21、发明构思的实施例包括根据声明20所述的方法,其中,确定对kv存储装置的一组kv请求以对接收的块请求进行仿真的步骤包括:至少部分地基于lba生成用于数据的键。

声明22、发明构思的实施例包括根据声明18所述的方法,其中,对kv存储装置执行所述一组kv请求以生成结果的步骤还包括:

使用第二键从kv存储装置读取第二对象的第二数据;

修剪对象的第二数据的尾部部分,以产生修剪数据;以及

更新第二对象,以使用键存储修剪数据。

声明23、发明构思的实施例包括根据声明22所述的方法,其中,确定对kv存储装置的所述一组kv请求以对接收的块请求进行仿真的步骤包括:确定块写入请求与第二对象重叠。

声明24、发明构思的实施例包括根据声明18所述的方法,其中,对kv存储装置执行所述一组kv请求以生成结果的步骤包括:

使用第二键从kv存储装置读取第二对象的第二数据;

修剪对象的第二数据的头部部分,以产生修剪数据;

生成用于修剪数据的第二键;以及

将第二对象存储在kv存储装置上,以使用第二键存储修剪数据。

声明25、发明构思的实施例包括根据声明24所述的方法,其中,对kv存储装置执行所述一组kv请求以生成结果的步骤还包括:从kv存储装置移除第二对象。

声明26、发明构思的实施例包括根据声明24所述的方法,其中,确定对kv存储装置的一组kv请求以对接收的块请求进行仿真的步骤包括:确定块写入请求与第二对象重叠。

声明27、发明构思的实施例包括根据声明18所述的方法,其中,对kv存储装置执行所述一组kv请求以生成结果的步骤包括:移除kv存储装置上的对象。

声明28、发明构思的实施例包括根据声明18所述的方法,其中:

在用于键值(kv)存储装置的块接口仿真器处接收来自源的块请求的步骤包括:在用于kv存储装置的块接口仿真器处接收来自源的块读取请求,块读取请求包括逻辑块地址(lba);以及

对kv存储装置执行所述一组kv请求以生成结果的步骤包括:从kv存储装置读取对象,对象包括与键相关联的数据,对象包括所述lba。

声明29、发明构思的实施例包括根据声明28所述的方法,其中,确定对kv存储装置的一组kv请求以对接收的块请求进行仿真的步骤包括:将对象识别为至少包括所述lba。

声明30、发明构思的实施例包括根据声明28所述的方法,其中,对kv存储装置执行所述一组kv请求以生成结果的步骤还包括:选择来自对象的数据的一部分。

声明31、发明构思的实施例包括根据声明28所述的方法,其中,对kv存储装置执行所述一组kv请求以生成结果的步骤还包括:

从kv存储装置读取第二对象,第二对象包括与第二键相关联的第二数据;以及

合并所述数据和第二数据以产生结果。

声明32、发明构思的实施例包括根据声明31所述的方法,其中,确定对kv存储装置的一组kv请求以对接收的块请求进行仿真的步骤包括:确定块读取请求与所述对象和第二对象重叠。

声明33、发明构思的实施例包括根据声明18所述的方法,其中:

块请求至少包括第一lba和第二lba;

确定对kv存储装置的一组kv请求以对接收的块请求进行仿真的步骤包括:确定针对第一lba的第一kv请求和针对第二lba的第二kv请求;以及

对kv存储装置执行所述一组kv请求以生成结果的步骤包括:执行第一kv请求和第二kv请求两者。

声明34、发明构思的实施例包括根据声明18所述的方法,所述方法还包括:

在kv存储装置处接收阈值数量的导致错误的块请求;以及

锁定kv存储装置。

声明35、发明构思的实施例包括根据声明34所述的方法,其中,在kv存储装置处接收阈值数量的导致错误的块请求的步骤包括:在kv存储装置处接收在第一阈值时间量内的所述阈值数量的导致错误的块请求。

声明36、发明构思的实施例包括根据声明34所述的方法,所述方法还包括:在第二阈值时间量之后解锁kv存储装置。

声明37、发明构思的实施例包括根据声明34所述的方法,所述方法还包括:由kv存储装置的管理员解锁kv存储装置。

声明38、发明构思的实施例包括根据声明18所述的方法,所述方法还包括:将块仿真器配置为使用块大小。

声明39、发明构思的实施例包括一种包含非暂时性存储介质的产品,非暂时性存储介质具有存储在非暂时性存储介质上的指令,所述指令在被机器执行时,使得:

在用于键值(kv)存储装置的块接口仿真器处接收来自源的块请求;

确定对kv存储装置的一组kv请求,以对接收的块请求进行仿真;

对kv存储装置执行所述一组kv请求,以生成结果;以及

将结果从kv存储装置返回给源。

声明40、发明构思的实施例包括根据声明39所述的产品,其中,块请求包括块写入请求、块读取请求和块修剪请求中的一者。

声明41、发明构思的实施例包括根据声明39所述的产品,其中:

在用于键值(kv)存储装置的块接口仿真器处接收来自源的块请求的步骤包括:在用于kv存储装置的块接口仿真器处接收来自源的块写入请求,块写入请求包括逻辑块地址(lba)和数据;以及

对kv存储装置执行所述一组kv请求的步骤包括:执行kv写入请求以在kv存储装置上存储对象,对象包括与键相关联的所述数据。

声明42、发明构思的实施例包括根据声明41所述的产品,其中,确定对kv存储装置的一组kv请求以对接收的块请求进行仿真的步骤包括:至少部分地基于lba生成用于数据的键。

声明43、发明构思的实施例包括根据声明39所述的产品,其中,对kv存储装置执行所述一组kv请求以生成结果的步骤还包括:

使用第二键从kv存储装置读取第二对象的第二数据;

修剪对象的第二数据的尾部部分,以产生修剪数据;以及

更新第二对象,以使用键存储修剪数据。

声明44、发明构思的实施例包括根据声明43所述的产品,其中,确定对kv存储装置的一组kv请求以对接收的块请求进行仿真的步骤包括:确定块写入请求与第二对象重叠。

声明45、发明构思的实施例包括根据声明39所述的产品,其中,对kv存储装置执行所述一组kv请求以生成结果的步骤包括:

使用第二键从kv存储装置读取第二对象的第二数据;

修剪对象的第二数据的头部部分,以产生修剪数据;

生成用于修剪数据的第二键;以及

将第二对象存储在kv存储装置上,以使用第二键存储修剪数据。

声明46、发明构思的实施例包括根据声明45所述的产品,其中,对kv存储装置执行所述一组kv请求以生成结果的步骤还包括:从kv存储装置移除第二对象。

声明47、发明构思的实施例包括根据声明45所述的产品,其中,确定对kv存储装置的一组kv请求以对接收的块请求进行仿真的步骤包括:确定块写入请求与第二对象重叠。

声明48、发明构思的实施例包括根据声明39所述的产品,其中,对kv存储装置执行所述一组kv请求以生成结果的步骤包括:移除kv存储装置上的对象。

声明49、发明构思的实施例包括根据声明39所述的产品,其中:

在用于键值(kv)存储装置的块接口仿真器处接收来自源的块请求的步骤包括:在用于kv存储装置的块接口仿真器处接收来自源的块读取请求,块读取请求包括逻辑块地址(lba);以及

对kv存储装置执行所述一组kv请求以生成结果的步骤包括:从kv存储装置读取对象,对象包括与键相关联的数据,对象包括所述lba。

声明50、发明构思的一个实施例包括根据声明49所述的产品,其中,确定对kv存储装置的一组kv请求以对接收的块请求进行仿真的步骤包括:将对象识别为至少包括所述lba。

声明51、发明构思的实施例包括根据声明49所述的产品,其中,对kv存储装置执行所述一组kv请求以生成结果的步骤还包括:选择来自对象的数据的一部分。

声明52、发明构思的实施例包括根据声明49所述的产品,其中,对kv存储装置执行所述一组kv请求以生成结果的步骤还包括:

从kv存储装置读取第二对象,第二对象包括与第二键相关联的第二数据;以及

合并数据和第二数据,以产生结果。

声明53、发明构思的一个实施例包括根据声明52所述的产品,其中,确定对kv存储装置的一组kv请求以对接收的块请求进行仿真的步骤包括:确定块读取请求与对象和第二对象重叠。

声明54、发明构思的实施例包括根据声明39所述的产品,其中:

块请求至少包括第一lba和第二lba;

确定对kv存储装置的一组kv请求以对接收的块请求进行仿真的步骤包括:确定针对第一lba的第一kv请求和针对第二lba的第二kv请求;以及

对kv存储装置执行所述一组kv请求以生成结果的步骤包括:执行第一kv请求和第二kv请求两者。

声明55、发明构思的实施例包括根据声明39所述的产品,非暂时性存储介质具有存储在非暂时性存储介质上的附加指令,所述附加指令在被机器执行时,使得:

在kv存储装置处接收阈值数量的导致错误的块请求;以及

锁定kv存储装置。

声明56、发明构思的实施例包括根据声明55所述的产品,其中,在kv存储装置处接收阈值数量的导致错误的块请求的步骤包括:在kv存储装置处接收在第一阈值时间量内的所述阈值数量的导致错误的块请求。

声明57、发明构思的实施例包括根据声明55所述的产品,非暂时性存储介质具有存储在非暂时性存储介质上的附加指令,所述附加指令在被机器执行时,使得在第二阈值时间量之后解锁kv存储装置。

声明58、发明构思的实施例包括根据声明55所述的产品,非暂时性存储介质具有存储在非暂时性存储介质上的附加指令,所述附加指令在被机器执行时,使得由kv存储装置的管理员解锁kv存储装置。

声明59、发明构思的实施例包括根据声明39所述的产品,非暂时性存储介质具有存储在非暂时性存储介质上的附加指令,所述附加指令在被机器执行时,使得将块仿真器配置为使用块大小。

因此,鉴于对在这里描述的实施例的广泛的各种置换,本具体实施方式和所附材料仅意图为说明性的,并且不应被视为限制发明的范围。因此,如发明所要求保护的是可以落入权利要求及其等同物的范围和精神内的所有这样的修改。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1