实现分散原子I/O写入的制作方法

文档序号:13423608阅读:162来源:国知局
实现分散原子I/O写入的制作方法

本公开涉及用于在存储设备中执行分散原子i/o写入的技术。



背景技术:

无。



技术实现要素:

本公开涉及用于在存储设备中执行分散原子i/o写入的技术。该技术可在存储设备(诸如hdd、ssd或sshd设备)中实现,以解决需要在单个原子操作中处理多个分散写入的应用程序(诸如数据库应用程序)。根据一些实施方案,用于在存储设备中执行分散原子i/o写入的方法包括从请求者接收待作为原子单元完成的块i/o写入请求列表,该块i/o写入请求列表指定多个块i/o写入,其中该多个块i/o写入中的至少两者指定存储介质上的不连续数据位置。将该多个块i/o写入中的每一者缓存在写入缓冲器中,并且将对应于该多个块i/o写入中的每一者的缓冲器条目标记为具有无效状态,其中将缓冲器条目标记为具有无效状态防止其被刷新到存储介质。在缓存所有多个块i/o写入时,将对应于该多个块i/o写入中的每一者的缓冲器条目标记为具有有效状态,其中将缓冲器条目标记为具有有效状态使得其有资格被刷新到存储介质。在将对应于该多个块i/o写入中的每一者的缓冲器条目标记为具有有效状态时,向请求者确认该块i/o写入请求列表的成功完成。

根据另外的实施方案,计算机可读介质包括处理器可执行指令,其致使可操作地连接到存储设备的处理器从请求者接收待作为原子单元完成的块i/o写入请求列表,其中该块i/o写入请求列表指定多个块i/o写入,其中该多个块i/o写入中的至少两者指定存储设备的存储介质上的不连续数据位置。针对该多个块i/o写入中的每一者生成原子链接标识符,从而将块i/o写入与块i/o写入请求列表相关联,并且将该多个块i/o写入中的每一者连同所生成的原子链接标识符提交到存储设备的控制器。在从控制器接收到所提交的块i/o写入中的最后一者的完成时,确定所提交的块i/o写入中的任一者是否由控制器有错误地完成。如果所提交的块i/o写入中的任一者由控制器有错误地完成,则处理器向请求者有错误地完成块i/o写入请求列表。如果所有所提交的块i/o写入均由控制器成功地完成,则处理器向请求者确认块i/o写入请求列表的成功完成。

根据另外的实施方案,系统包括包含存储介质的存储设备、用于在刷新到存储介质之前临时存储针对存储设备所接收的块i/o写入请求的写入缓冲器以及用于处理块i/o写入请求的控制器。控制器被配置为接收块i/o写入请求并且基于与该块i/o写入请求相关联的原子链接标识符来确定该块i/o写入请求是否与待作为原子单元完成的块i/o写入请求列表相关联。块i/o写入请求被缓存在写入缓冲器中,同时对应于该块i/o写入请求的缓冲器条目被标记为具有无效状态,其中将缓冲器条目标记为具有无效状态防止其被刷新到存储介质。在基于原子链接标识符来缓存与块i/o写入请求列表相关联的块i/o写入请求中的最后一者时,控制器将与块i/o写入请求列表相关联的缓冲器条目同时标记为具有有效状态,其中将缓冲器条目标记为具有有效状态致使相关联的块i/o写入请求有资格被刷新到存储介质。

各种实施方案的这些和其他特征及方面将在阅读以下具体实施方式并且查看附图后变得显而易见。

附图说明

在以下具体实施方式中,参考附图,附图形成本文的一部分并且以举例说明方式示出特定实施方案或示例。此处,附图未按比例绘制。类似的标号在若干个图中始终表示类似的元件。

图1是示出根据本文描述的实施方案的一种用于在存储设备中执行分散原子i/o写入的方法的流程图。

图2是示出用于实现本文描述的实施方案的一个示例性环境的框图。

图3是示出根据本文描述的实施方案的含有多个块i/o写入请求的示例性原子块i/o列表结构的数据结构图。

图4是示出根据本文描述的实施方案的用于跟踪组成原子操作的各个块i/o写入请求的提交的示例性命令提交表结构的数据结构图。

图5是示出根据本文描述的实施方案的一种向存储设备的控制器提交并跟踪原子操作中的各个块i/o写入请求的方法的流程图。

图6是示出根据本文描述的实施方案的存储设备的控制器中的示例性写入缓冲器的框图。

图7是示出根据本文描述的实施方案的用于从主机设备跟踪所提交的原子块i/o写入请求的示例性原子i/o请求跟踪表结构的数据结构图。

图8是示出根据本文描述的实施方案的一种使用存储设备的写入缓冲器以原子方式处理一组相关块i/o写入请求的方法的流程图。

具体实施方式

以下具体实施方式涉及用于在存储设备(诸如固态盘(“ssd”)设备、硬盘驱动器(“hdd”)设备或固态混合盘(“sshd”)设备)中实现分散原子i/o写入的技术。许多存储设备支持针对存储介质上的连续块范围的单个i/o写入命令的原子性。例如,在ssd设备中实现的许多闪存控制器支持单个i/o写入原子性。另外,已经针对单个原子写入请求批准了小型计算机系统接口(“scsi”)标准。然而,单个原子写入的原子性针对一些应用场景不允许最佳i/o性能,在这些应用场景中跨多个分散(本文中还称为“不连续”)写入(诸如命中多个表的数据库应用程序的事务写入)需要原子性。在这些情况下,除了存储设备所执行的任何缓存之外,还可能需要数据库应用程序在内部缓存写入以保证跨事务的完整性。这个双重缓存可显著降低应用程序性能。

例如,利用ext4或xfs文件系统的mysql数据库以页为单位(通常大小为16kb)从其缓冲池发出对数据文件的写入。为了刷新16kb缓冲页,mysql针对16kb直接i/o发出write()系统调用(即,打开带有“o_direct”标记的文件)。然而,这些文件系统中的每个文件系统块的默认大小(以及最大大小)是4kb。在mysql中消除双重写入缓存需要确保mysql服务器所发出的16kb页写入的原子性。由于这继而由n=4个可能不连续的4kb文件系统块组成,所以文件系统(ext4或xfs)无法在没有来自基础存储设备的分散原子写入支持的情况下靠自身保证原子性。

根据本文描述的实施方案,可实现对存储设备执行一组相关块i/o写入的方法以使得跨对存储设备上的不连续块的多个写入保证原子性。该方法利用存储设备的单个i/o写入原子性能力来作为单个原子单元执行写入,从而不需要双重缓存并且向需要分散i/o写入原子性的应用程序提供相当大的i/o性能提升。另外,利用所述方法可改善ssd设备中的存储介质的耐久性。根据一些实施方案,该方法可在存储设备的固件和/或所连接的主机计算机或服务器上实现的相关联块i/o设备驱动程序中实现。可在设备驱动程序上方的i/o框架中(诸如在linux内核块层中以及/或者在应用程序i/o接口层中)实现额外变化和扩展,以便允许应用程序或os指定一组相关写入要作为原子单元来执行。

图1示出了根据一些实施方案的用于在单个原子操作中对存储设备执行多个分散写入的一个例程100。该例程100可在处理来自执行需要存储设备中的分散i/o写入原子性的应用程序的数据库服务器或其他主机计算机的块i/o写入请求时执行。根据一些实施方案,例程100可由存储设备的控制器和/或主机计算机上的相关联设备驱动程序执行。根据一些实施方案,例程100在步骤102处开始,其中设备驱动程序接收待作为原子单元完成的块i/o写入请求列表。每个块i/o写入请求可为直接i/o请求(例如,以打开带“o_direct”标记的文件为目标),从而绕过os的文件系统和任何相关联的读取或写入高速缓存。另外,块i/o写入请求的目标地址可表示存储设备上的非连续块。在一些实施方案中,请求者还可针对列表中的每个块i/o写入请求设置指示符,其指示这些块i/o写入请求要作为原子单元来执行。

根据一些实施方案,设备驱动程序可针对所接收的块i/o写入请求列表维持“原子链接标识符”。例如,设备驱动程序可针对块i/o写入请求列表创建跟踪结构并且向每个块i/o写入请求指派共用提交id和单独命令索引,如本文中更详细描述。驱动程序还可利用该跟踪结构来跟踪列表中的每个块i/o写入请求的提交,以确保仅当所有单独块i/o写入请求已被成功完成时才向请求者完成该请求。设备驱动程序可接着将列表中的每个块i/o写入请求提交到存储设备的控制器以供执行。根据实施方案,驱动程序进一步将原子链接标识符连同每个块i/o写入请求提交到控制器。

接下来,在步骤104处,存储设备的控制器将各个块i/o写入请求缓存在缓冲器(诸如写入高速缓存器)中。根据实施方案,控制器可基于与之一起提交的原子链接标识符来辨识待作为原子单元执行的那些块i/o写入请求,例如,具有共用提交id值的所有块i/o写入请求。控制器还可针对每个提交id创建跟踪结构以便跟踪作为原子单元的部分的所有块i/o写入请求的状态,如本文中更详细描述。根据一些实施方案,控制器将把用于作为原子单元的部分的块i/o写入请求的所有缓冲器条目标记为无效。以此方式,这些写入将不被从缓冲器刷新到存储介质,而是将保留在缓冲器中。控制器可进一步在一旦请求被缓存时便对设备驱动程序完成每个单独块i/o写入请求,并且驱动程序将相应地更新跟踪结构。

如步骤106处所指示,控制器将继续缓存作为相同原子单元(例如,具有相同提交id值)的部分的块i/o写入请求并且将其标记为无效,直到原子单元中的最后一个块i/o写入请求已被缓存为止。例如,控制器可利用其跟踪结构来确定用于该提交id值的最后一个块i/o写入请求何时已被缓存。一旦用于原子单元的最后一个块i/o写入请求已被缓存,例程100便前进到步骤108,其中控制器遍历用于块i/o写入请求的缓冲器条目并且将其全部标记为有效,从而允许写入请求被刷新到存储介质。

因为存储设备具有保证各个块i/o写入请求中的每一者的原子性的能力,并且因为用于原子单元的所有块i/o写入请求在被刷新之前被放置在写入缓冲器中,所以整个原子单元将根据需要被一起写入到存储介质。因此,当设备驱动程序从控制器接收到所有块i/o写入请求的成功完成时,例程100前进到步骤110并且驱动程序向请求者成功完成该请求。如果列表中的块i/o写入请求中的任一者由控制器有错误地完成,则整个请求向请求者有错误地完成。从步骤110,例程100结束。

在错误的情况下,控制器已经缓存的那些块i/o写入请求将保持处于无效状态并且将不被刷新到存储介质。根据一些实施方案,无效缓冲器条目可在正常例程的过程中并且/或者在从中间错误或电力故障恢复期间由控制器清理。例如,如果在处理原子单元中的块i/o写入请求中间发生电力故障,则当存储设备在电力故障之后重新启动时,缓冲器中的具有无效状态的任何缓冲器条目将没有资格被刷新到存储介质。在这种情况下,可作为从电力故障恢复的一部分丢弃整个无效缓冲器条目链。

图2和以下描述旨在提供对可在其中实现本文描述的实施方案的合适环境200的概要描述。具体地讲,图2示出根据本文提供的实施方案的示例性存储设备202(诸如hdd设备),连同用于以原子方式执行多个分散i/o写入的硬件、软件和部件。根据实施方案,存储设备202包括存储介质204,数据以非易失性方式存储在该存储介质上。例如,存储介质204可包括一个或多个可旋转磁片或盘片,其具有磁性记录表面和用于将数据写入到磁性表面以及从磁性表面读取数据的相关联读取/写入头。在其他实施方案中,存储介质204可包括固态存储器、光学存储介质、磁性存储介质和/或这些和其他存储技术的任何组合。

存储设备202还可包括控制器210,其控制存储设备的操作。控制器210可包括处理器212。处理器212可实现允许存储设备202与主机设备230通信的主机接口214,该主机设备诸如为服务器计算机、个人计算机(“pc”)、膝上型计算机、笔记本计算机、平板电脑、游戏机、机顶盒或能够以通信方式耦接至存储设备202以存储数据以及从存储设备检索数据的任何其他电子设备。处理器212可通过格式化相关联数据并且经由读取/写入通道216将经过格式化的数据传送到存储介质204来处理通过主机接口214从主机设备230接收的写入命令。读取/写入通道216可在处理器212所处理的数字信号与管理存储介质204所必要的读取和写入信号之间转换数据。处理器212可进一步通过确定所需数据在存储介质204上的位置、经由读取/写入通道216从所确定的位置读取数据、校正任何错误并且格式化该数据以供传送到主机设备230来处理来自主机设备的读取命令。

主机接口214可包括串行at附接(“sata”)接口、串行附接scsi(“sas”)接口等。在一些实施方案中,控制器210和主机接口214呈现块i/o设备,其中主机设备使用逻辑块地址(“lba”)以用于指定主机设备230的读取和写入命令的目标位置。逻辑块地址可表示固定大小(诸如512b或4kb)的存储在存储设备202中的数据块,并且可由控制器210转化为存储介质204上的存储位置。

主机设备230可包括设备驱动程序232,其允许在主机设备230上执行的应用程序234和/或os与存储设备202交接。设备驱动程序232可表示以软件、硬件或两者的组合实现的处理器可执行指令和/或数字逻辑。例如,设备驱动程序232可存储在主机设备230的存储器中。在一些情况下,应用程序234可通过os236所提供的抽象(诸如文件系统)执行i/o命令,并且os通过设备驱动程序232与存储设备202交接。在其他情况下,应用程序234可直接与设备驱动程序232交接并且/或者通过主机接口214交接以执行i/o命令。这在本文中称为“直接i/o”。例如,数据库应用程序234(诸如mysql开源关系数据库管理系统(“rdbms”))可针对存储相关命令利用直接i/o,从而绕过os236和任何相关联的抽象层和/或高速缓存。

在一些实施方案中,设备驱动程序232可包括多个逻辑层,诸如与存储设备202相关联的设备特定层238和为应用程序234和/或os提供接口的通用层239(诸如linux操作系统中的linux内核块层)。根据另外的实施方案,设备驱动程序232可执行本文描述的用于在存储设备202中实现分散原子i/o写入的例程100和500的一些或所有步骤,如本文中相对于图1和图5所描述。

控制器210还可包括计算机可读存储介质或“存储器”230,以用于存储处理器可执行指令、数据结构和其他信息。存储器218可包括非易失性存储器,诸如只读存储器(“rom”)和/或flash存储器。存储器218还可包括易失性随机存取存储器(“ram”),诸如动态随机存取存储器(“dram”)或同步动态随机存取存储器(“sdram”)。例如,存储器218可存储包括用于执行存储设备202的操作所必要的命令和数据的固件。根据一些实施方案,存储器218可存储处理器可执行指令,其在由处理器212执行时执行本文描述的用于在存储设备202中实现分散原子i/o写入的例程100和800的一些或所有步骤,如相对于图1和图8所描述。

在一些实施方案中,存储器218可包括写入缓冲器220。处理器212可将从主机设备230接收的块i/o写入请求临时存储在写入缓冲器220中,直到其中所含有的数据可被写入到存储介质204为止。例如,写入缓冲器220可在控制器的dram和/或flash中实现。在另外的实施方案中,存储器218可存储用于以原子方式执行多个分散i/o写入所必要的其他数据结构,如本文描述。

除了存储器218之外,环境200还可包括其他计算机可读介质,其存储本文描述的用于以原子方式执行多个分散i/o写入的程序模块、数据结构和其他数据。本领域的技术人员应当理解,计算机可读介质可为可由控制器210、主机设备230或其他计算系统存取以用于信息的非暂态存储的任何可用介质。计算机可读介质包括以任何方法或技术实现的易失性和非易失性、可装卸和不可装卸的存储介质,包括但不限于ram、rom、可擦除可编程rom(“eprom”)、电可擦除可编程rom(“eeprom”)、flash存储器或其他固态存储器技术、压缩光盘rom(“cd-rom”)、数字通用磁盘(“dvd”)、高清晰度dvd(“hd-dvd”)、blu-ray或其他光学存储设备、盒式磁带、磁带、磁盘存储设备或其他磁性存储设备等。

在另外的实施方案中,环境200可包括分散原子写入模块240。分散原子写入模块240可处置以原子方式执行多个分散i/o写入的各方面,如本文描述。根据一些实施方案,分散原子写入模块240可在控制器210中被实现为软件、硬件或两者的任何组合。例如,分散原子写入模块240可存储在存储器218中作为存储设备202的固件的一部分,并且可由处理器212执行以用于执行本文描述的方法和过程。分散原子写入模块240可另选地或额外地存储在可由控制器210存取的其他计算机可读介质中。在另外的实施方案中,例如,分散原子写入模块240可在位于存储设备202外部并且可操作地连接到存储设备202的计算系统(诸如连接到许多“不智能的”磁盘驱动器的群集控制器)中或在通过主机接口214连接到存储设备202的主机设备230的设备驱动程序232中实现。

应当理解,存储设备202和主机设备230的结构和/或功能性可不同于图2示出并且本文描述的内容。例如,处理器212、读取/写入通道216、存储器218以及存储设备202的其他部件和电路可集成在共用集成电路封装内或分布在多个集成电路封装当中。类似地,出于举例说明而非限制的目的来提供所示出的连接通道,并且可出于清楚的目的省略一些部件和/或互连件。还应当理解,环境200可不包括图2中所示的所有部件,可包括图2中未明确示出的其他部件,或可包括利用与图2所示的架构完全不同的架构的存储设备、主机设备和其他计算设备。

图3、图4和图7是示出计算机存储设备中的许多数据元素和数据结构的数据结构图。本领域的技术人员应当理解,图中所示的数据结构可表示计算机存储器中所存储的对象、以代码定义的编程结构、数据库表中的行或本领域中通常已知的任何其他数据容器的实例。每个数据元素可表示对象的一个或多个属性、编程结构的一个或多个成员变量、数据库表的一个或多个字段或列、处理单元中的寄存器或者本领域中通常已知的任何其他数据单元或数据结构。具体实施是一种选择,并且可取决于实现数据结构和数据元素所用的计算硬件和软件架构的技术、性能和其他要求。

图3示出含有待作为原子单元完成的块i/o写入请求列表的原子块i/o请求列表302的一个示例。根据一些实施方案,原子块i/o请求列表302可由设备驱动程序232从在主机设备230上执行的应用程序234接收。原子块i/o请求列表302可包括块i/o(“bio”)写入请求304a至304n(本文中通常称为bio写入请求304)的链接列表。在一些实施方案中,每个bio写入请求304包括直接i/o写入请求并且包括逻辑块地址(“lba”)306和待写入到存储设备202中的指定块的数据308。根据实施方案,各种bio写入请求304的lba306可表示存储设备202上的不连续块。在另外的实施方案中,原子块i/o请求列表302可包括列表中的每个bio写入请求304的指示符,诸如“req_atomic”标记,其指示块i/o写入请求要作为原子单元来执行。应当理解,原子块i/o请求列表302可包括对于图3示出并且本文描述的那些元素而言额外或不同的元素。

图4示出由设备驱动程序232用作跟踪结构以跟踪向存储设备202的控制器210提交待作为原子单元完成的bio写入请求304a至304n的列表的命令提交表402的一个示例。在一些实施方案中,设备驱动程序232可针对从在主机设备230上执行的应用程序234或os236接收的每个原子块i/o请求列表302维持命令提交表402的例子。可在命令提交表402中针对所接收的列表中的每个bio写入请求304a至304n分配单独的命令404a至404n(本文中通常称为命令404),并且命令404可含有用于每个bio写入请求的“原子链接标识符”。例如,列表中的所有bio写入请求304可被指派相同的唯一提交id406,并且每个bio写入请求将进一步被指派命令索引408。提交id406和命令索引408将与对应于列表中的bio写入请求304a至304n的每个命令404一起提交到存储设备202的控制器210,并且可用于参考命令提交表402内的相关联命令结构以便跟踪每个请求。

另外,命令提交表402可包括表示原子块i/o请求列表302中的bio写入请求304a至304n的计数的列表中命令数量值410、表示控制器210待决的命令404的数量的未解决命令数量值412以及表示失败的命令404的数量的有错误完成命令数量值414。根据一些实施方案,未解决命令数量值412将最初等于列表中命令数量值410,并且随着控制器210完成每个命令404而递减。当未解决命令数量值412达到零时,如果有错误完成命令数量值414不是零,则该请求将被向请求者有错误地完成。否则,其被成功地完成。应当理解,命令提交表402可包括对于图4示出并且本文描述的那些元素而言额外或不同的元素。

图5示出了根据一些实施方案的用于将原子块i/o请求列表302中的各个bio写入请求304提交到存储设备202的控制器210并且利用命令提交表402跟踪请求的状态的一个例程500。在一些实施方案中,例程500可由在主机设备230上执行的设备驱动程序232中实现的分散原子写入模块240的部分执行,如本文相对于图2所描述。在另外的实施方案中,例程500可由在存储设备202的控制器210中实现的处理器212、由可操作地连接到存储设备的主机设备230或由这些和/或其他部件、模块、处理器和设备的任何组合执行。

例程500在步骤502处开始,其中分散原子写入模块240接收分散原子写入请求。根据实施方案,该请求包括原子块i/o请求列表302,其含有待作为原子单元完成的bio写入请求304的列表。在一些实施方案中,写入请求可包括一系列直接i/o写入请求(例如,以打开带“o_direct”标记的文件为目标),并且还包括指示符(诸如“req_atomic”标记),其指示这些写入请求要作为原子单元来执行。

例程500从步骤502前进到步骤504,其中分散原子写入模块240针对该请求创建命令提交表402的例子。在一些实施方案中,针对请求生成唯一id值并且在命令提交表402中针对每个bio写入请求304分配命令404,其中提交id406被设置为所生成的id值并且命令索引408被设置为表示bio写入请求在列表中的位置的索引值。

例程500从步骤504前进到步骤506,其中将对应于bio写入请求304a至304n的命令404a至404n分派给存储设备202的控制器210。根据实施方案,每个提交命令404包括来自命令提交表402的相关联提交id406和命令索引408值。在一些实施方案中,命令404可通过主机接口214直接提交到控制器。在其他实施方案中,与控制器210的通信协议可被扩展为包括提交id406和命令索引408值。例如,除了用于将对应于bio写入请求304的每个命令404提交到控制器所必要的其他元素之外,“raid_context”结构可被定义为包括这些值,如以下伪码中所示:

应当理解,由于主机接口214的异步性质,命令404a至404n可不以任何特定次序提交到控制器210。因此,可能有必要的是向控制器210指示待作为原子单元完成的相关写入请求的数量,即,被指派相同提交id406的命令404的数量。根据一些实施方案,分散原子写入模块240可针对列表中的最后一个命令404n设置命令索引408值的最高有效位(“msb”)以便将原子单元中的写入请求的计数传送给控制器210,如以下伪码中所示出:

接下来,作为步骤508,分散原子写入模块240将命令提交表402中的未解决命令数量值412设置为等于列表中命令数量值410,并且例程500前进到步骤510,其中分散原子写入模块240等待控制器210完成所提交的命令404。当控制器210向设备驱动程序完成命令404时,例程500从步骤510前进到步骤512,其中使命令提交表402中的未解决命令数量值412递减。另外,如果命令404产生错误,则使命令提交表402中的有错误完成命令数量值414递增,如步骤514和516处所示。根据一些实施方案,分散原子写入模块240可利用与命令404相关联的提交id406来确定待更新的命令提交表402。

接下来,如步骤518处所示,分散原子写入模块240确定未解决命令数量值412是否等于零。如果未解决命令数量值412不等于零,则例程500返回到步骤510,其中分散原子写入模块240等待控制器完成未解决命令404的剩余部分。如果未解决命令数量值412等于零,则例程500从步骤518前进到步骤520,其中分散原子写入模块240确定有错误完成命令数量值414是否等于零。如果有错误完成命令数量值414不等于零,则例程500前进到步骤522,其中向请求者有错误地完成分散原子写入请求。因此,如果控制器210有错误地完成对应于bio写入请求304的命令404中的任一者,或者任何命令超时或以其他方式未成功地完成,则整个原子写入请求向请求者有错误地完成。如果有错误完成命令数量值414等于零,则例程500前进到步骤524,其中向请求者成功地完成分散原子写入请求。从步骤522或524,例程500结束。

图6示出存储设备202中的示例性写入缓冲器220的详情。例如,写入缓冲器220可表示ssd或hdd设备中的传统写入高速缓存器。写入缓冲器220可被配置为存储多个缓冲器条目602a至602n(本文中通常称为缓冲器条目602),其包括写入命令或命令群组,诸如本文描述的bio写入请求304。根据一些实施方案,每个缓冲器条目602具有相关联的data_invalid标记604。data_invalid标记604允许控制器210防止将对应于缓冲器条目602的写入命令刷新到存储介质204,直到用于该写入命令的数据已经被完全写入到写入缓冲器220为止。根据另外的实施方案,存储设备202和控制器210可被配置为使得一旦写入缓冲器220中的缓冲器条目602为有效的(例如,data_invalid标记604被清除),便保证将相关联数据完整写入到存储介质204。

在一些实施方案中,每个缓冲器条目602还可具有相关联先前条目id606,其识别针对相同提交id406添加到写入缓冲器的先前缓冲器条目602。先前条目id606允许包括对应于相关bio写入请求304的命令404的缓冲器条目602链接为链以使得控制器210能够快速遍历缓冲器条目602以清除data_invalid标记604,如本文中更详细描述。应当理解,根据一些实施方案,与每个缓冲器条目602相关联的data_invalid标记604和先前条目id606可被存储在与写入缓冲器220相关联的元数据中。

图7示出被控制器210用作跟踪结构以跟踪设备驱动程序232所提交的各种分散原子写入请求的原子i/o请求跟踪表702的一个示例。例如,原子i/o请求跟踪表702可被存储在存储设备202的控制器210的存储器218中。如上文论述,控制器210可通过使对应于bio写入请求304的一组提交命令404具有相同提交id406来将其辨识为属于相同原子单元。当从设备驱动程序232接收具有新提交id406值的命令404时,控制器210可在原子i/o请求跟踪表702中创建跟踪条目704a至704k(本文通常称为跟踪条目704)并且向提交id406指派该新的跟踪条目。如图7中可见,根据一些实施方案,原子i/o请求跟踪表702可被配置为存储某个数量k的跟踪条目704以便处置多个同时分散原子写入请求。

每个跟踪条目704还可包括列表中命令数量值708,其指示组成原子单元中的bio写入请求304的所提交的命令404的总数量。根据一些实施方案,控制器210可通过核查每个命令的命令索引408值的msb来确定在原子单元中所提交的命令404的数量。当接收具有msb被设置的命令索引408的命令404时,控制器可利用用于那个命令的命令索引的值来针对相关联的跟踪条目704设置列表中命令数量值708,如本文中相对于图8更详细地描述。

每个跟踪条目704还可包括完成命令数量值710,其指示成功完成的与提交id406相关联的命令404的数量。在一些实施方案中,随着每个命令404被添加到写入缓冲器220,控制器可使完成命令数量值710递增。当完成命令数量值710等于列表中命令数量值708时,控制器210可针对所有相关联的缓冲器条目602清除data_invalid标记,从而致使用于原子单元的所有命令404被刷新到存储介质204。应当理解,原子i/o请求跟踪表702可包括对于图7示出并且本文描述的那些元素而言额外或不同的元素。

图8示出了根据一些实施方案的用于使用存储设备202的写入缓冲器220以原子方式处理对应于bio写入请求304的列表的一组相关命令404的一个例程800。在一些实施方案中,例程800可由在控制器210中实现的分散原子写入模块240的部分执行,如上文相对于图2所描述。在另外的实施方案中,例程800可由在存储设备202的控制器210中实现的处理器212、由可操作地连接到存储设备的主机设备230或由这些和/或其他部件、模块、处理器和设备的任何组合执行。

例程800在步骤802处开始,其中接收命令404。根据一些实施方案,命令404可从在连接到存储设备202的主机设备230上执行的设备驱动程序232接收。例程800从步骤802前进到步骤804,其中分散原子写入模块240确定是否与命令404一起提交了提交id406。如果没有指定提交id406(例如,提交id=0或空),则例程800前进到步骤806,其中控制器210可正常地处理命令404,因为其不与待作为原子单元完成的相关bi写入请求304的列表相关联。从步骤806,例程800结束。

如果与命令404一起指定提交id406(例如,在raidcontext结构中),则例程800从步骤804前进到步骤808,其中分散原子写入模块240确定在原子i/o请求跟踪表702中针对提交id406是否存在跟踪条目704。如果不存在与指定提交id406的值相关联的跟踪条目704,则分散原子写入模块240在原子i/o请求跟踪表702中创建跟踪条目并且将其指派给该提交id,如步骤810处所示。

接下来,在步骤812处,分散原子写入模块240确定是否设置所指定的命令索引408的msb,其指示命令404n对应于列表中的最后一个bio写入请求304n。如果设置了命令索引408的msb,则例程800从步骤812前进到步骤814,其中分散原子写入模块240根据命令索引408的指定值在与提交id406相关联的跟踪条目704中设置列表中命令数量值708。例如,分散原子写入模块240可实现由以下伪码示出的例程:

接下来,例程800前进到步骤816,其中分散原子写入模块240将命令404添加到写入缓冲器220。根据实施方案,分散原子写入模块240设置与新近添加的缓冲器条目602相关联的data_invalid标记604,其指示所缓存的写入命令不被刷新到存储介质204。在另外的实施方案中,分散原子写入模块240可进一步将与缓冲器条目602相关联的先前条目id606设置为指向与相同提交id406相关联的先前缓冲器条目。分散原子写入模块240可跟踪针对原子i/o请求跟踪表702中的对应跟踪条目704中的每个提交id406添加的最后一个缓冲器条目602的标识符,例如,以便在写入缓冲器220中维持对应于相关bio写入请求304a至304n的命令404a至404n的链。

例程800从步骤816前进到步骤818,其中分散原子写入模块240使与提交id406相关联的跟踪条目704中的完成命令数量值710递增。接下来,在步骤820处,分散原子写入模块240确定完成命令数量值710是否等于跟踪条目704中的列表中命令数量值708。如果完成命令数量值710不等于列表中命令数量值708,则例程800从步骤820前进到步骤822,其中分散原子写入模块240向驱动程序成功地完成命令404。例程接着返回到步骤802,其中分散原子写入模块240等待来自驱动程序的下一个命令404。

如果完成命令数量值710等于列表中命令数量值708,则例程800从步骤820前进到步骤824,其中分散原子写入模块240清除用于与提交id406相关联的写入缓冲器220中的所有缓冲器条目602a至602n的相关联data_invalid标记604,从而致使对应于用于原子单元的bio写入请求304a至304n的所有命令404至404n均被刷新到存储介质204。根据一些实施方案,分散原子写入模块240可利用与每个缓冲器条目602相关联的先前条目id606,以新近添加的缓冲器条目开始,遍历与原子单元相关的所有条目并且清除data_invalid标记604。例程800从步骤824前进到步骤826,其中分散原子写入模块240向设备驱动程序232成功地完成最后一个命令404。从步骤826,例程800结束。

基于前述内容,应当理解,本文呈现用于在存储设备中实现分散原子i/o写入的技术。尽管本文相对于ssd或hdd设备来描述实施方案,但应当理解,本公开中所描述的实施方案可在任何存储设备中使用,所述存储设备结合写入缓冲器或写入高速缓存器并且被配置为保证对连续块范围的单个i/o写入的原子性,包括但不限于磁盘驱动器、混合磁性和固态驱动器、光盘存储设备等。另外,尽管各种部件和步骤被描述为在主机设备上执行的设备驱动程序中或在存储设备的控制器中驻留并且/或者执行,但应当理解,这些部件和步骤可单独地在控制器中、单独地在主机设备上驻留并且/或者执行,或者以任何组合分布在主机设备与控制器之间。上述实施方案仅仅是为了清楚理解本公开的原理而陈述的具体实施的可能示例。

本文中描述为例程、方法或过程的一部分的逻辑步骤、功能或操作可被实现为(1)在控制器或计算系统上运行的一系列处理器实现的动作、软件模块或代码部分和/或(2)控制器或计算系统内的互连机器逻辑电路或电路模块。具体实施是一种选择,其取决于系统的性能和其他要求。包括另选的具体实施,其中可根本不包括或执行步骤、操作或功能,可不以所示出或论述的次序执行步骤、操作或功能,包括基本上同时或以相反次序,这取决于所涉及的功能性,如本公开的领域的技术人员将理解。

还应当理解,条件语言(诸如“可以”、“能够”、“可能”或“可”等)通常旨在传达特定实施方案包括特定特征、元件和/或步骤,而其他实施方案不包括,除非另有详细描述或在所使用的上下文内以其他方式理解。因此,此类条件语言通常不是旨在暗示针对一个或多个特定实施方案无论如何需要特征、元件和/或步骤或者一个或多个特定实施方案必须包括用于在具有或没有用户输入或提示的情况下决定在任何特定实施方案中是否包括或者要执行这些特征、元件和/或步骤的逻辑。

可在基本上不脱离本公开的精神和原理的情况下对上述实施方案做出许多变型和修改。另外,本公开的范围旨在覆盖上文论述的所有元件、特征和方面中的任一者以及所有组合和子组合。希望所有此类修改和变型在本公开的范围内包括在本文中,并且希望对元件或步骤的各个方面或组合的所有可能权利要求由本公开支持。

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