本发明用于使用目标协作的快速排序写入的方法和系统。总体上来说,本技术的实施例涉及用于在包括多个分离的存储模块(storagemodule)的存储设备(storageappliance)中执行快速排序写入的方法和系统。更具体地,本技术的实施例使得能够将数据多播到存储设备中的多个存储模块,其中处理写入请求的顺序在存储设备中的所有存储模块上是相同的。
背景技术
存储设备包括存储介质(storagemedia)并且提供使客户端能够向该存储介质写入数据和从该存储介质读取数据的机制。
技术实现要素:
根据本公开的一个方面涉及一种用于处理写入请求的方法。该方法包括:由第一存储模块接收来自客户端的第一提交请求;响应于接收到所述第一提交请求:处理所述第一提交请求,其中处理所述第一提交请求导致第一数据的第一副本被存储在所述第一存储模块中的永久性存储器(memory)中;由所述第一存储模块生成针对第二存储模块的第二提交请求;向所述第二存储模块发送所述第二提交请求;从所述第二存储模块接收指示所述第一数据的第二副本被存储在所述第二存储模块中的永久性存储器中的第一提交回复;响应于接收到所述第一提交回复并且在处理所述第一提交请求之后,由所述第一存储模块生成对应于所述第一提交请求的第二提交回复;向所述客户端发送所述第二提交回复。
根据本公开的另一个方面涉及一种存储设备。该存储设备包括:结构(fabric);存储阵列,其可操作地连接到所述结构并且包括第一存储模块和所述第二存储模块。所述第一存储模块被配置为:经由所述结构接收来自客户端的第一提交请求;响应于接收到所述第一提交请求:处理所述第一提交请求,其中处理所述第一提交请求导致第一数据的第一副本被存储在所述第一存储模块中的永久性存储器中;生成针对第二存储模块的第二提交请求;经由所述结构向所述第二存储模块发送所述第二提交请求;经由所述结构从所述第二存储模块接收指示所述第一数据的第二副本被存储在所述第二存储模块中的永久性存储器中的第一提交回复;响应于接收到所述第一提交请求并且在处理所述第一提交请求之后,生成对应于所述第一提交请求的第二提交回复;和经由所述结构向所述客户端发送所述第二提交回复。
附图说明
图1a至1c示出了根据本技术的一个或多个实施例的系统。
图2至5示出了根据本技术的一个或多个实施例的流程图。
图6示出了根据本技术的一个或多个实施例的示例系统。
具体实施方式
在本技术的实施例的以下详细描述中,阐述了许多具体细节以便提供对该技术更透彻的理解。然而,对于本领域的普通技术人员来说显而易见的是,可以在没有这些具体细节的情况下实践该技术。在其他情况下,没有详细描述众所周知的特征以避免不必要地使描述复杂化。
在整个申请中,序数(例如,第一、第二、第三等)可以用作元素(即,本申请中的任何名词)的形容词。序数的使用并不意味着或创建任何特定的元素排序,也不限制任何元素仅为单个元素,除非明确地公开,例如通过使用术语“之前”、“之后”、“单个”和其他类似术语。更确切地说,序数的使用是为了区分这些元素。作为示例,第一元素不同于第二元素,并且第一元素可以包含多于一个元素并且在元素的排序中在第二元素之前(或先于)。
在以下对图1a至6的描述中,在本技术的各个实施例中关于附图描述的任何组件可以等同于关于任何其他附图描述的一个或多个相同名称的组件。为了简洁起见,这些组件的描述将不会关于每个图重复。因此,每个附图的组件的每个和每一个实施例通过引用并入并且被假定为可选地存在于具有一个或多个相同命名组件的每个其他附图中。另外,根据本技术的各种实施例,附图的组件的任何描述将被解释为可选的实施例,除了、结合或替代关于任何其他图中的对应相同命名组件描述的实施例,可以实施可选的实施例。
总体上来说,本技术的实施例涉及用于在包括多个分离的存储模块的存储设备中执行快速排序写入的方法和系统。更具体地,本技术的实施例使得能够将数据多播到存储设备中的多个存储模块,其中处理写入请求的顺序在存储设备中的所有存储模块上是相同的。该技术的实施例能够实现上述顺序,而不需要客户端协调将数据写入存储设备。具体地,本技术的实施例使用结构(例如,pcie结构)结合存储模块之间的协调(例如参见图4至5)来强制执行写入请求的排序。
在本技术的一个实施例中,排序在存储模块上是一致的,使得存储在各个存储模块(或存储模块的子集)中的数据是相同的。例如,考虑存储设备包括三个存储模块(1、2、3)的情况。此外,假设客户端a发出指定对象和偏移的第一写入请求(a),并且客户端b发出指定相同对象和偏移的第二写入请求(b)。该技术的实施例确保写入请求(a,b)在每个存储模块上以相同的顺序被处理,使得在两个写入请求都已经在三个存储模块(1、2、3)上被处理之后,针对特定对象和偏移存储的数据在三个存储模块(1、2、3)中的每一个上都是相同。
图1a示出了根据本技术的一个或多个实施例的系统。参考图1a,该系统包括可操作地连接到存储设备(100)的一个或多个客户端(客户端a(108a)-客户端m(108m))。
在本技术的一个实施例中,客户端(108a-108m)可以是任何类型的物理系统,其包括向存储设备(100)发出读取请求和/或向存储设备(100)发出写入请求的功能。虽然在图1a中未示出,但是每个客户端(108a-108m)分别可以包括客户端处理器(未示出)、客户端存储器(未示出)以及实现本技术的一个或多个实施例所需的任何其他软件和/或硬件。
在本技术的一个实施例中,客户端(108a-108m)被配置为执行包括文件系统的操作系统(os)。文件系统提供了用于从存储设备(100)存储和检索文件的机制。更具体地说,文件系统包括执行必要动作以向存储设备(100)发出读取请求和写入请求的功能。文件系统还可以提供编程接口以使得能够创建和删除文件,读取和写入文件,在文件内执行搜索,创建和删除目录,管理目录内容等。另外,文件系统还提供管理接口以创建和删除文件系统。在本技术的一个实施例中,为了访问文件,操作系统(经由文件系统)通常提供文件操作接口以打开、关闭、读取和写入每个文件内的数据和/或操纵相应的元数据。在本技术的另一个实施例中,客户端被配置为执行用于访问存储设备的块驱动程序。在本技术的另一个实施例中,客户端被配置为执行使得客户端能够访问存储设备的应用编程接口(api)。
在本技术的一个实施例中,客户端(108a-108m)与存储设备(100)的结构(106)对接以与存储设备(100)通信,如以下在图2中进一步描述的。
在本技术的一个实施例中,存储设备(100)是包括永久性存储装置并被配置为服务于来自一个或多个客户端(108a-108m)的读取请求和/或写入请求的系统。
根据本技术的一个或多个实施例,存储设备(100)包括组织在存储阵列(102)中的一个或多个存储模块(104a-104n)和将存储器模块(104a-104n)与客户端(108a-108m)对接的结构(106)。下面介绍这些组件中的每一个。
根据本技术的实施例,存储阵列(106)容纳一个或多个存储模块(104a-104n)。根据需要或期望,存储阵列可实现存储设备的模块化配置,其中存储模块可被添加到存储设备(100)或从存储设备(100)移除。根据本发明的实施例的存储模块(104)参考图1c在下面描述。
继续讨论存储设备(100),存储设备包括结构(106)。结构(106)可以使用以下协议中的一个或多个来提供客户端(108a-108m)与存储模块(104a-104n)之间的物理连接:外围组件互连(pci)、pci-express(pcie)、pci-extended(pci-x)、非易失性存储器express(nvme)、pci-express结构的非易失性存储器express(nvme)、以太网结构的非易失性存储器express(nvme)和infiniband结构的非易失性存储器express(nvme)。本领域技术人员将认识到,该技术不限于上述协议。下面参考图1b描述根据本技术的实施例的结构(106)。
图1b示出了根据本技术的一个或多个实施例的结构。结构(106)包括一个或多个叶层交换机(110a、110m)和一个或多个集线器层交换机(112a、112n)。下面描述这些组件中的每一个。
关于叶层交换机(110a、110m),每个叶层交换机是连接到一个或多个客户端(108)的物理pcie交换机,并且每个客户端(108)可以连接到一个或多个叶层交换机。每个叶层交换机也连接到一个或多个集线器层交换机。在本技术的一个实施例中,每个叶层交换机连接到结构中的每个集线器层交换机,导致结构中的层之间的完全连接的网格。在不脱离本技术的情况下,可以在层之间没有完全连接的网格的情况下实施本技术的实施例。
在本技术的一个实施例中,每个叶层交换机被配置为:(i)从其所连接的客户端接收事务层分组(tlp),并使用地址路由将tlp路由到适当的集线器层交换机;以及(ii)从叶层交换机连接到的一个或多个集线器层交换机接收tlp,并使用地址路由将tlp路由到适当的客户端。
关于集线器层交换机(112a-112n),每个集线器层交换机是连接到一个或多个叶层交换机(110a-110m)并连接到一个或多个存储模块(104)的物理pcie交换机。此外,每个存储模块可以连接到一个或多个集线器层交换机。在本技术的一个实施例中,每个集线器层交换机连接到结构中的每个其他叶层交换机,导致结构中的层之间的完全连接的网格。在不脱离本技术的情况下,可以在层之间没有完全连接的网格的情况下实施本技术的实施例。
在本技术的一个实施例中,每个集线器层交换机被配置为:(i)从与其连接的存储模块(104)接收tlp,并使用地址路由将tlp路由到适当的叶层交换机,以及(ii)从集线器层交换机连接到的一个或多个叶层交换机接收tlp,并使用地址路由将tlp路由到适当的存储模块(104)。
另外,一个或多个集线器层交换机被配置为响应于从叶层交换机接收单个tlp而生成多个tlp。例如,客户端(108)可以将包括多播地址的tlp生成并发送到叶层交换机。叶层交换机评估多播地址,并基于评估将tlp路由到集线器层交换机。集线器层交换机随后接收tlp并且评估基于评估被识别为多播地址的地址。基于评估,生成n个tlp。然后将n个tlp中的每一个发送到不同的存储模块。
在本技术的一个实施例中,结构可以同时从多个客户端接收tlp。但是,结构将tlp的传输序列化到存储模块。更具体地说,在本技术的一个实施例中,每个集线器层交换机将其从各种客户端接收到的tlp的处理序列化。结果,集线器层交换机还将tlp的传输序列化到存储模块。通过这种方式,集线器层交换机确保它向每个存储模块发出的tlp以相同的顺序发出。
在本技术的一个实施例中,结构被配置为执行图3至5中所示的全部或部分方法。
图1c示出了根据本技术的一个或多个实施例的存储模块(104)。存储模块(104)包括存储模块控制器(120)、缓冲器(122)、一个或多个提交队列(124a、124n)、一个或多个完成队列(128a、128n)和永久性存储装置(126)。下面描述这些组件中的每一个。
在本技术的一个实施例中,存储模块控制器(120)被配置为接收和服务于从永久性存储装置(122)读取和/或写入数据的请求。这些请求可以源自客户端(108)并且可以经由结构(106)被传送到存储模块控制器(120)。此外,存储模块控制器(124)可以被编程为或者以其他方式被配置为执行图4和图5中所示的全部或部分方法。
在本技术的一个实施例中,存储模块控制器(120)包括处理器(未示出)(例如,被配置为执行指令的处理器的一个或多个内核或微内核)、一个或多个硬件寄存器(未示出)和存储器(示出)(例如易失性存储器,其可以是但不限于动态随机存取存储器(dram)、同步dram、sdrsdram和ddrsdram)以执行图4和图5中所描述的方法的一部分。或者,存储模块控制器(120)可以使用现场可编程门阵列(fpga)和/或专用集成电路(asic)来实现。
在本技术的一个实施例中,存储模块(104)的永久性存储装置(126)可以包括但不限于自旋扭矩磁性ram(st-mram)、相变存储器(pcm)、nand闪存和nor闪存。本领域技术人员将认识到,该技术不限于上述类型的永久性存储装置。
在本技术的一个实施例中,永久性存储器将数据存储为对象。因此,通过指定对象标识符(id)和偏移(即,对象内的偏移),可以将数据写入对象和/或从对象读取数据。
永久性存储器可以在逻辑上被划分成主分区(130)和一个或多个从分区(132a、132m)。从分区的数量对应于在其上要存储数据副本的其他存储模块的数量。例如,考虑存在三个存储模块(sm1、sm2、sm3)并且数据的副本要存储在每个存储模块上的情况。在该示例中,数据的一个副本可以存储在sm1的主分区中,数据的第二副本可以存储在sm2的从分区中,并且数据的第三副本可以存储在sm3的从分区中。在本技术的一个实施例中,存储模块维护主分区中的地址与相应从分区(位于其他存储模块上)中的一个或多个地址之间的地址映射。
本领域技术人员将认识到,从客户端(图1,108)的角度看,当永久性存储器被逻辑分区(如上所述)时,永久性存储器表现为单个统一地址空间。换句话说,永久性存储器的分区是以对客户端透明的方式执行的。
在本技术的一个实施例中,缓冲器(122)是易失性存储器,其在数据被存储在永久性存储装置中之前暂时存储由存储模块接收的数据。
在本技术的一个实施例中,存储模块可以包括一个或多个提交队列(124a、124n)。提交队列按照存储模块接收的顺序存储提交请求。在本技术的一个实施例中,存储模块包括单个全局提交队列,其中存储从所有客户端接收的所有提交请求。在本技术的另一个实施例中,存储模块包括一组提交队列,其中每个提交队列仅存储从特定客户端接收的提交请求和/或从特定主存储模块(例如参见图5和图6)接收的提交请求。
在本技术的一个实施例中,存储模块可以包括一个或多个完成队列(128a、128n)。完成队列存储由存储模块从其他存储模块接收的提交回复(参见例如图4至6)。在本技术的一个实施例中,存储模块包括单个全局完成队列,其中存储从所有存储模块接收的所有提交回复。在本技术的另一个实施例中,存储模块包括一组完成队列,其中每个完成队列仅存储从特定存储模块接收的提交回复。
本领域技术人员将认识到,系统的架构不限于图1a至1c中所示的组件。例如,存储设备(100)的组件可以包括任何数量的存储模块(104a-104n)。此外,存储模块(104)的存储模块控制器(120)可以配备有中央处理单元(cpu)、现场可编程门阵列(fpga)、专用集成电路(asic)和/或任何其他类型的处理器,而不偏离本技术。此外,结构可以基于除了上面讨论的那些之外的通信标准,而不偏离本技术。
图2至5示出了根据本技术的一个或多个实施例的流程图。尽管顺序地呈现和描述了流程图中的各个步骤,但本领域的普通技术人员将会理解,可以以不同的顺序执行一些或全部步骤,可以组合或省略这些步骤,并且一些或全部步骤可以并行执行。在该技术的一个实施例中,图2至5可以与图2至5中所示的任何其他步骤并行执行。
图2示出了根据本技术的一个或多个实施例的从客户端的角度将数据写入存储模块的方法。
在步骤200中,客户端生成包括地址和数据的写入请求。包括在写入请求中的地址可以是多播地址。更具体地说,从客户端的角度来看,地址可以显示为任何其他地址;然而,当地址由结构评估时,其导致生成n个写入请求(参见例如图3,步骤304)。
在步骤202中,写入请求由客户端发出到结构。如果结构是pcie结构(即,实现pcie的结构),则可以使用一个或多个tlp来发出写入请求。
在步骤204中,客户端生成包括地址的提交请求。尽管写入请求包括要传输的数据,但是提交请求包括导致数据存储在永久性存储器中的命令(参见例如图4、图5)。在本技术的一个实施例中,客户端使用一致散列函数利用对象标识符和偏移作为输入来确定用于提交请求的地址。更具体地说,对于特定对象(使用对象标识符识别)和偏移的提交请求总是被发送到针对<对象id,偏移>的相同存储模块(即,“主存储模块”)。在本发明的一个实施例中,一致散列函数被用于识别主存储模块。此外,因为每个客户端实现相同的一致散列函数,所以针对特定<对象id,偏移>的所有提交请求被发送到针对<对象id,偏移>的相同存储模块(即,“主存储模块”)而不考虑哪个客户端生成提交请求。
在本技术的一个实施例中,提交请求被发送到经由写入请求接收数据的存储模块之一。例如,考虑存在三个存储模块(sm1、sm2、sm3),并且对于<对象id1,偏移3>在每个存储模块上要存储数据副本的情况。在这种情况下,在写入请求中使用与多播组(即,sm1、sm2、sm3)相关联的多播地址向各个存储模块传输数据。此外,一致散列函数与用作输入的<对象id1,偏移3>组合以将sm2识别为针对<对象id1,偏移3>的主存储模块。相应地,提交请求被发送到sm2。
继续图2的讨论,在步骤206中,提交请求由客户端发出到结构。如果结构是pcie结构(即,实现pcie的结构),则可以使用一个或多个tlp来发出提交请求。
在稍后的某个时间点,在步骤208中,客户端从结构中接收到提交回复,所述提交回复是由接收到在步骤206中发出的提交请求的存储模块发起的(假设提交请求已被成功处理并且结构保持可操作)。
图3示出了根据本技术的一个或多个实施例的从结构的角度向存储模块写入数据的方法。
在步骤300中,包括数据和多播地址的写入请求由结构中的叶交换机接收。如果结构是pcie结构,则可以将写入请求作为一个或一组tlp接收。
在步骤302中,叶交换机处理写入请求。更具体地说,写入请求的处理包括评估写入请求中的地址以识别集线器层交换机(或可操作地连接到集线器层交换机的出口端口)。处理的结果是将写入请求传发送到集线器层交换机。在本技术的一个实施例中,特定集线器层交换机处理针对给定地址的所有写入请求。例如,包括地址a的结构接收的所有写入请求都被路由到集线器层交换机a。
在步骤304中,响应于接收到写入请求,集线器层交换机处理写入请求。写入请求的处理包括确定写入请求中的地址是多播地址,并且响应于该确定,生成n个写入请求。生成的写入请求的具体数量(n)在集线器层交换机上预先配置。在本技术的一个实施例中,每个生成的写入请求包括单播地址。
在步骤306中,将所生成的写入请求(即,在步骤304中生成的写入请求)发送到存储模块。更具体地,n个写入请求中的每一个被发送到存储设备中的n个存储模块之一。
在步骤308中,对应于(在步骤300中接收的)写入请求的提交请求由结构中的叶交换机接收。如果结构是pcie结构,则提交请求可以作为一个或一系列tlp被接收。
在步骤310中,叶交换机处理提交请求。处理的结果是将提交请求发送到连接到主存储模块的集线器层交换机。
在步骤312中,响应于接收到提交请求,集线器层交换机处理提交请求。处理的结果是将提交请求发送到主存储模块(即,针对<对象id,偏移>的主存储模块)。
在稍后的某个时间点,在步骤314中,结构从主存储模块接收到提交回复。在步骤316中,结构将提交回复发送到客户端(假定结构保持可操作)。
图4示出了根据本技术的一个或多个实施例的从具有单个全局提交队列的存储模块的角度将数据写入存储模块的方法。
在步骤400中,从结构接收单播写入请求(即,在步骤306中由结构发出的写入请求)。
在步骤402中,将与写入请求相关联的数据存储在“主”存储模块的缓冲器中。
在步骤404中,从结构接收单播提交请求(即,在步骤312中由结构发出的提交请求)。
在步骤406中,将单播提交请求放置在单个全局提交队列中。在本技术的一个实施例中,提交请求包括或者以其他方式与客户端标识符相关联。在相应提交回复的生成和/或处理中使用客户端标识符(参见例如图4,步骤414)。
在步骤408中,基于先进先出机制来处理全局提交队列中的提交请求,以便保持处理顺序。处理提交请求的结果是将数据存储在永久性存储器中的主分区中的位置中。换句话说,数据写入永久性存储器的顺序由处理提交请求的顺序决定,而不是由存储模块接收写入请求(和/或数据)的顺序决定。
在步骤410中,主存储模块生成n-1个提交请求,并经由结构将其发送到n-1个从存储模块。例如,考虑存在三个存储模块(sm1、sm2、sm3),并且数据副本要存储在<对象id1,偏移3>的每个存储模块上的情况。此外,假定sm1是<对象id1,偏移3>的主存储模块。在这种情况下,sm1生成两个提交请求-一个发送给sm2,并且另一个发送给sm3。在本技术的一个实施例中,在步骤408中将数据存储在永久性存储器的主分区中可以与步骤410并行执行。
在步骤412中,经由结构从从存储模块接收n-1个提交回复,并将其存储在主存储模块上的全局完成队列中。继续该示例,从步骤410开始,sm1(在该示例中是主存储模块)将从sm2接收一个提交回复,并且从sm3接收一个提交回复(假定提交回复被成功处理)。本领域技术人员将认识到,在某些情况下,在所有提交请求被发送到从存储模块之前,由主存储模块可以接收到一个或多个提交回复。例如,主存储模块将提交请求发送到从存储模块1,并在向子存储模块2发送提交请求之前从从存储模块1接收对应的提交回复。
继续图4的讨论,在步骤414中,由主存储模块生成提交回复并将其发送到结构。在本技术的一个实施例中,提交回复是至少部分地基于与对应的提交请求(即,在步骤404中接收的提交请求)相关联的客户端标识符生成的。如果从n-1个从存储模块接收到n-1个提交回复并且步骤408中的提交请求被主存储模块成功处理,则可以仅由主存储模块生成提交回复。
图5示出了根据本技术的一个或多个实施例的从具有单个全局提交队列的从存储模块的角度将数据写入存储模块的方法。
在步骤500中,从结构接收单播写入请求(即,在步骤306中由结构发布的写入请求)。
在步骤502中,将与写入请求相关联的数据存储在存储模块的缓冲区中。
在步骤504中,从结构接收单播提交请求(即,在步骤410中由主存储模块发出的提交请求)。
在步骤506中,将单播提交请求放置在单个全局提交队列中。在本技术的一个实施例中,提交请求包括或者以其他方式与客户端标识符相关联。在对应的提交回复的生成和/或处理中使用客户端标识符(参见例如图5,步骤510)。
在步骤508中,基于先进先出机制来处理全局提交队列中的提交请求,以便保持处理顺序。换句话说,数据写入永久性存储器的顺序由处理提交请求的顺序决定,而不是由存储模块接收写入请求(和/或数据)的顺序决定。
处理提交请求的结果是将数据存储在永久性存储器中。更具体地说,考虑从存储模块从主存储模块接收写入请求1(wr1)并且随后接收提交请求1(cr1)的情况。处理cr1的结果是将与wr1相关联的数据从存储模块中的缓冲器复制到存储模块中的永久性存储器中的对应从分区中的位置。
在步骤510中,生成对应于在步骤504中接收到的提交请求的提交回复,并经由结构将其发送到主存储模块。在本技术的一个实施例中,提交回复是至少部分地基于与对应的提交请求相关联的客户端标识符来生成的。
在本技术的一个实施例中,步骤500-506与步骤508-510并行执行。具体而言,步骤500-506导致全局提交队列的填充,而步骤508-510导致处理全局提交队列中的提交请求。本领域的技术人员将会理解,可以对于每个<对象id,偏移>并行执行图5中所示的方法。
关于图4和图5中的全局提交队列中的提交请求的处理,本领域技术人员将认识到,用于任何存储模块的全局提交队列可以包括源自一个或多个客户端的提交请求以及源自一个或多个主存储模块的提交请求。在提交请求来自客户端的情况下,提交请求的处理根据图4执行而如果从主存储模块接收到提交请求则根据图5执行提交请求的处理。
此外,虽然已经关于在主存储模块中使用单个全局提交队列和在每个从存储模块中使用单个全局提交队列描述了图4和图5,但是本技术的实施例可以使用以下来实现:(i)一组提交队列和(ii)一组完成队列。该组提交队列可以包括针对每个客户端的每个客户端提交队列和针对每个从其接收到提交请求的主存储模块的每个主存储模块提交队列。此外,该组完成队列可以包括针对每个从其接收到提交回复的从存储模块的每个从存储模块完成队列。
在本技术的这样的实施例中,每个提交请求包括全局排序标签或者以其他方式与全球排序标签相关联。全局排序标签用于维护由存储模块接收到的提交请求的全局处理顺序。全局排序标签可以被存储模块控制器添加到提交请求(或以其他方式与提交请求相关联)。此外,基于全局排序标签处理每个客户端提交队列中的提交请求,以便保持存储模块中的全局处理顺序。
本领域的技术人员将理解,可以使用其他方案来组织提交队列和/或完成队列,而不偏离本技术。
图6示出了根据本技术的一个或多个实施例的示例系统。该示例并不打算限制该技术的范围。
转到该示例,考虑其中客户端想要将三个数据副本存储在存储设备中的情况。为了将三个数据副本存储在存储设备中,客户端发出具有多播地址和数据的写入请求,并将该请求发送到结构。该结构响应于接收到写入请求而生成并发出三个写入请求。这导致在每个存储模块(存储模块1、存储模块2、存储模块3)中的缓冲器(未示出)中存储数据的一个副本。
客户端随后生成提交请求(提交请求a)。在这个示例中,假设数据被写入<对象5,偏移3>,并且主存储模块(如使用一致散列函数确定的)是存储模块1。因此,提交请求经由结构被发送到存储模块1。
响应于接收到提交请求a,存储模块1将提交请求a存储在存储模块1中的提交队列(未示出)中。提交请求a随后由存储模块1处理,导致数据的副本(当前在存储模块1中的缓冲器中)存储在存储模块1中的永久性存储器的主分区1a中的位置中。存储模块1还生成两个提交请求(提交请求b和提交请求c)。存储模块1然后经由结构将提交请求b发送到存储模块2并且将提交请求c发送到存储模块3。如上所述,提交请求a的处理可以与提交请求b和提交请求c的生成和传输并行地执行。
响应于接收到提交请求b,存储模块2将提交请求b存储在存储模块2中的提交队列(未示出)中。提交请求b随后由存储模块2处理,导致数据的副本(当前在存储模块2中的缓冲器中)被存储在存储模块2中的永久性存储器的从分区2a中的位置中。在提交请求b已经被处理之后,存储模块2经由结构生成提交回复b并且将其传输到存储模块1。
响应于接收到提交请求c,存储模块3将提交请求c存储在存储模块3中的提交队列(未示出)中。提交请求c随后由存储模块3处理,导致数据的副本(当前在存储模块3中的缓冲器中)被存储在存储模块3中的永久性存储器的从分区3a中的位置中。在提交请求c已经被处理之后,存储模块3经由结构生成提交回复c并且将其传输到存储模块1。
返回到存储模块1,存储模块1接收提交回复b和提交回复c并且将其存储在完成队列中。一旦提交请求a已被处理并且已经接收到提交回复b和c,存储模块a就经由结构生成提交回复a并将其传输到客户端。
尽管已经关于有限数量的实施例描述了本技术,但是受益于本公开的本领域技术人员将会理解,可以设计出不偏离在此公开的技术范围的其他实施例。因此,本技术的范围应仅由所附权利要求来限定。