用于原子存储操作的系统和方法与流程

文档序号:17195945发布日期:2019-03-27 09:29阅读:314来源:国知局
用于原子存储操作的系统和方法与流程

本披露涉及存储系统、并且具体涉及用于保持文件一致性的系统和方法。



技术实现要素:

本文中披露了一种用于实现原子存储操作的方法的实施例。所披露的方法的实施例可以包括:使事务性标识符与原子存储请求的目标标识符相链接;将该原子存储请求的存储操作重定向至这些事务性标识符;和/或响应于完成该原子存储请求的这些存储操作而将这些重定向后的存储操作的数据从这些事务性标识符移至这些目标标识符。

这些存储操作可以包括使将数据与元数据一起附加至存储介质上,该元数据被配置成用于使所附加的该数据与这些事务性标识符中的一个或多个事务性标识符相关联。移动所附加的该数据可以包括将元数据存储在该存储介质上,该元数据被配置成用于使所附加的该数据与这些目标标识符相关联。

这些存储操作包括将数据与元数据一起存储在非易失性存储介质上,该元数据被配置成用于使所存储的该数据与同对应的事务性标识符相关联的一个或多个中间标识符绑定。移动所存储的该数据可以包括将持久性注释存储在该非易失性存储介质上,该持久性注释被配置成用于使该一个或多个中间标识符与对应的目标标识符绑定。在一些实施例中,该方法进一步包括响应于移动这些重定向后的存储操作的数据而确认该原子存储请求完成。

本文中披露了一种用于实现原子存储操作的设备的实施例。所披露的设备可以包括:重定向模块,该重定向模块被配置成用于将第二标识符集合映射到存储请求的第一逻辑标识符集合;日志存储模块,该日志存储模块被配置成用于在该第二标识符集合内在存储装置上执行该存储请求的存储操作;和/或原子存储模块,该原子存储模块被配置成用于将该存储请求的这些存储操作移至该第一逻辑标识符集合。该原子存储模块可以被配置成用于通过将持久性元数据存储到该存储装置上来移动这些存储操作。该持久性元数据可以被配置成用于将联合该第二标识符集合存储在该存储装置上的数据段与该第一标识符集合绑定。该原子存储模块可以被进一步配置成用于响应于确定该持久性元数据将会存储在该存储装置上而确认该存储请求完成。该第一标识符集合可以包括多个不相交的逻辑标识符集合,并且该持久性元数据可以是单个持久性注释,该单个持久性注释被配置成用于将这些数据段与该多个不相交的逻辑标识符集合内的对应逻辑标识符绑定。

在一些实施例中,该重定向模块被配置成用于将该第二标识符集合分配在与该第一标识符集合的地址空间不同的地址空间内。可替代地,该重定向模块可以被配置成用于将该第二标识符集合分配在该第一标识符集合的地址空间中的指定区域内。该第二标识符集合可以与事务性地址空间相对应,并且所披露的设备可以进一步包括重构模块,该重构模块被配置成用于使与该事务性地址空间中的标识符相关联的数据段失效。

该原子存储模块可以被配置成用于响应于移动存储操作而使该第一标识符集合内的标识符之一失效,该存储操作被配置成用于使该第二标识符集合内的标识符之一的数据失效。该日志存储模块可以被配置成用于将数据段附加到该存储装置上的有序数据段日志。该日志存储模块可以被进一步配置成用于将与该存储请求无关的数据段附加在该有序数据段日志内的该存储请求中的两个或更多个数据段之间。

本文中披露了一种用于实现原子存储操作的系统的实施例。该系统可以包括用于接收与目的逻辑标识符集合有关的原子存储请求的装置;用于使事物性标识符集合与该目的逻辑标识符集合相链接的装置;用于将与该原子存储请求有关的多个数据包附加到存储装置上的顺序存储日志上的装置,其中,这些数据包包括被配置成用于使这些数据包与对应的事物性标识符相关联的持久性元数据;和/或用于将持久性注释附加到该存储日志上的装置,其中,该持久性注释被配置成用于使包括持久性元数据的该多个数据包与对应的目的逻辑标识符相关联,该持久性元数据被配置成用于使这些数据包与对应的事务性标识符相关联。

所披露的系统可以进一步包括用于将该目的逻辑标识符集合中的逻辑标识符映射到对应的事务性标识符上的装置。在一些实施例中,该系统包括用于将这些事务性标识符中的一个或多个事务性标识符与同逻辑标识符相关联的存储位置绑定的装置,该逻辑标识符与该对应的一个或多个事务性标识符相链接。所披露的系统的实施例可以进一步包括用于响应于附加该持久性注释使用对应的目的逻辑标识符提供对这些数据包的访问的装置,这些数据包包括被配置成用于使这些数据包与对应的事务性标识符相关联的该持久性元数据。

这些目的逻辑标识符可以与逻辑地址空间相对应,并且这些事务性标识符可以与不同的事务性地址空间相对应。该系统可以进一步包括用于通过使用这些数据包的持久性元数据来重构该逻辑地址空间中的逻辑标识符与该存储装置上的数据包之间的映射索引的装置;和/或用于使与同该不同的事务性地址空间相对应的事务性标识符相关联的数据包失效的装置。

附图说明

图1A是用于打开至关闭一致性的系统的一个实施例的框图;

图1B描绘了存储元数据的实施例;

图1C是描绘存储阵列的一个实施例的框图;

图1D描绘了数据包格式的一个实施例;

图1E描绘了存储日志的一个实施例;

图2是用于打开至关闭一致性的系统的另一个实施例的框图;

图3A是包括存储层的系统的一个实施例的框图,该存储层被配置成用于高效地实现范围克隆、移动、合并、和其他更高级存储操作;

图3B描绘了范围克隆操作的实施例;

图3C描绘了范围克隆操作的进一步的实施例;

图3D描绘了范围克隆操作的进一步的实施例;

图3E描绘了范围克隆操作的进一步的实施例;

图4A是用于打开至关闭一致性的系统的另一个实施例的框图;

图4B描绘了通过使用引用映射来实现范围克隆操作的实施例;

图4C描绘了通过使用引用映射来实现范围克隆操作的进一步的实施例;

图4D描绘了通过使用引用映射来实现范围克隆操作的进一步实施例;

图4E描绘了通过使用引用映射来实现范围克隆操作的进一步实施例;

图5A是包括聚合层的系统的一个实施例的框图;

图5B描绘了通过使用聚合层来实现范围克隆操作的实施例;

图6描绘了去重复操作的实施例;

图7是描绘了包括存储层的系统的一个实施例的框图,该存储层被配置成用于高效地实现快照操作;

图8A-E描绘了范围移动操作的实施例;

图9A是包括存储层的系统的框图,该存储层被配置成用于实现高效文件管理操作;

图9B描绘了存储层的一个实施例,该存储层被配置成用于实现mmap检查点;

图9C描绘了由存储层实现的范围克隆和范围合并操作的实施例;

图9D描绘了范围克隆和范围合并操作的进一步实施例;

图9E描绘了范围克隆和范围合并操作的进一步实施例;

图9F是包括存储层的系统的一个实施例的框图,该存储层被配置成用于实现高效打开至关闭文件一致性;

图9G描绘了关闭至打开文件一致性的进一步的实施例;

图10A描绘了包括存储层的系统的一个实施例,该存储层被配置成用于实现原子存储操作;

图10B描绘了原子存储操作的实施例;

图11是用于对以上下文格式存储在非易失性存储介质上的数据的逻辑接口进行管理的方法的一个实施例的流程图;

图12是用于管理上下文数据的逻辑接口的方法的一个实施例的流程图;

图13是用于管理上下文数据的逻辑接口的方法的另一个实施例的流程图;

图14是用于管理范围合并操作的方法的一个实施例的流程图;

图15是用于管理范围克隆操作的方法的另一个实施例的流程图;

图16是用于管理范围合并操作的方法的另一个实施例的流程图;

图17是用于原子存储操作的方法的一个实施例的流程图;

图18是用于原子存储操作的方法的另一个实施例的流程图;以及

图19是用于原子存储操作的方法的另一个实施例的流程图。

具体实施方式

图1A是包括存储层130的计算系统100的一个实施例的框图,该存储层被配置成用于为一个或多个存储客户端106提供存储服务。如本文中进一步详细披露的,存储层130可以被配置成用于提供打开至关闭文件服务。计算系统100可以包括任何合适的计算装置,包括但不限于服务器、台式计算机、膝上型计算机、嵌入式系统、移动装置等等。在一些实施例中,计算系统100可以包括多个计算装置,如服务器计算装置集群。计算系统100可以包括多个处理资源101、多个易失性存储器资源102(例如,随机存取存储器(RAM))、多个非易失性存储资源103和/或通信接口104。处理资源101可以包括但不限于通用中央处理单元(CPU)、专用集成电路(ASIC)和可编程逻辑元件,如现场可编程门阵列(FPGA)、可编程逻辑阵列(PLA)等等。非易失性存储资源103可以包括非瞬态机器可读存储介质,如磁性硬盘、固态存储介质、光存储介质等等。通信接口104可以被配置成用于通信地将计算系统100耦合至网络105。网络105可以包括任何合适的通信网络,包括但不限于传输控制协议/互联网协议(TCP/IP)网络、局域网(LAN)、广域网(WAN)、虚拟专用网(VPN)、或存储区域网(SAN)、公共交换电话网(PSTN)、互联网等等。

计算系统100可以包括存储层130,该存储层可以被配置成用于向一个或多个存储客户端106提供存储服务。存储客户端106可以包括但不限于操作系统(包括裸金属操作系统、来宾操作系统、虚拟机、虚拟化环境等等)、文件系统、数据库系统、远程存储客户端(例如,通过网络105通信地耦合至计算系统100和/或存储层130上的存储客户端)等等。

存储层130(和/或其中的模块)可以用软件、硬件或其组合来实现。在一些实施例中,存储层130的各部分被体现作为可执行指令,如计算机程序代码,这些可执行指令可以存储在持久性、非瞬态存储介质上,如非易失性存储资源103。这些指令和/或计算机程序代码可以被配置成由处理资源101执行。可替代地或此外,存储层130的各部分可以被体现作为机器部件,如通用和/或专用部件、可编程硬件、FPGA、ASIC、硬件控制器、存储控制器。

存储层130可以被配置成用于在存储介质140上执行存储操作。存储介质140可以包括能够持久性地存储数据的任何存储介质。如本文中所使用的,“持久性”数据存储是指将信息存储在持久性、非易失性存储介质上。存储介质140可以包括非易失性存储介质(如一个或多个固态存储装置或驱动器(SSD)中的固态存储介质)、硬盘驱动器(例如,集成驱动电子设备(IDE)驱动器、小型计算机系统接口(SCSI)驱动器、串行附件SCSI(SAS)驱动器、串行高级技术附件(SATA)驱动器等)、磁带驱动器、可写光驱(例如,CD驱动器、DVD驱动器、蓝光驱动器等)等等。

在一些实施例中,存储介质140包括非易失性固态存储器,其可以包括但不限于:NAND闪速存储器、NOR闪速存储器、纳米RAM(NRAM)、磁阻RAM(MRAM)、相变RAM(PRAM)、赛道存储器、记忆电阻器存储器、基于纳米晶体线的存储器、基于氧化硅的亚10纳米进程存储器、石墨烯存储器、硅氧化氮氧化硅(SONOS)存储器、电阻型随机存取存储器(RRAM)、可编程金属化单元(PMC)、导电桥接RAM(CBRAM)等等。尽管本文中披露了存储介质140的具体实施例,但本披露的教导内容可以应用于任何合适形式的存储器,包括非易失性和易失性两种形式。相应地,尽管在非易失性固态存储装置140的背景下披露了存储层130的具体实施例,但存储层130可以与其他存储装置和/或存储介质一起使用。

在一些实施例中,存储介质140包括易失性存储器,其可以包括但不限于RAM、动态RAM(DRAM)、静态RAM(SRAM)、同步动态RAM(SDRAM)等。存储介质140可以与处理资源101的存储器相对应,如CPU高速缓存(例如,L1、L2、L3高速缓存等)、图形存储器等等。在一些实施例中,存储介质140通过使用互连127而通信地耦合至存储层130。互连127可以包括但不限于外围部件互联(PCI)、PCI Express总线(PCI-e)、串行高级技术附件(串行ATA或SATA)、并行ATA(PATA)、小型计算机系统接口(SCSI)、IEEE 1394(火线)、光纤通道、通用串行总线(USB)等等。可替代地,存储介质140可以是通过网络105(和/或其他通信接口,如存储区域网络(SAN)、虚拟存储区域网络(VSAN))通信地耦合至存储层130的远程存储装置等等)。因此,互连127可以包括远程总线(如PCE-e总线)、网络连接(例如,无限带宽)、存储网络、光纤通道协议(FCP)网络、超SCSI等等。

存储层130可以被配置成用于通过使用尤其存储控制器139来管理存储介质140上的存储操作。存储控制器139可以包括软件和/或硬件部件,包括但不限于在计算系统100上操作的一个或多个驱动程序和/或其他软件模块,如存储驱动程序、I/O驱动程序、过滤器驱动程序等等;硬件部件,如硬件控制器、通信接口等等;等等。存储介质140可以被体现在存储装置141上。存储层130的各部分(例如,存储控制器139)可以被实现为存储装置141的硬件和/或软件部件(例如,固件)。

存储控制器139可以被配置成用于在存储介质140的具体存储位置实现存储操作。如本文中所使用的,存储位置是指能够持久性地存储数据的存储资源的存储单元(例如,存储介质和/或装置);存储位置可以包括但不限于页、页组(例如,逻辑页和/或逻辑页内的偏移)、存储分区(例如,物理擦除块、逻辑擦除块等)、扇区、磁盘上的位置、电池支持的存储器位置等等。存储位置在存储介质140的存储地址空间144内是可寻址的。存储地址可以与物理地址、介质地址、后端地址、地址偏移等等相对应。存储地址可以与任何合适的存储地址空间144、存储寻址方案、和/或存储位置安排相对应。

存储层130可以包括接口131,通过该接口,存储客户端106可以访问存储层130所提供的存储服务。存储接口131可以包括以下各项中的一项或多项:块装置接口、虚拟化存储接口、一个或多个虚拟存储单元(VSU)、对象存储接口、数据存储接口、和/或其他合适的接口和/或应用程序编程接口(API)。

存储层130可以提供用于通过前端存储接口引用存储资源。如本文中所使用的,“前端存储接口”是指存储客户端106通过其可以引用存储层130的存储资源的接口和/或命名空间。存储接口可以与逻辑地址空间132相对应。逻辑地址空间132可以包括标识符组、集合、集、范围、和/或长度。如本文中所使用的,“标识符”或“逻辑标识符”(LID)是指用于引用源资源的标识符;LID可以包括但不限于名称(例如,文件名、辨别名等等)、数据标识符、参考号、链接、LID、前端标识符、逻辑地址、逻辑块地址(LBA)、逻辑单元号(LUN)地址、虚拟单元号(VUN)地址、虚拟存储地址、存储地址、物理地址、介质地址、后端地址等等。

逻辑地址空间132的逻辑容量可以与逻辑地址空间132中的LID数量和/或LID引用的存储资源的大小和/或粒度相对应。在一些实施例中,逻辑地址空间132可以是“精简配置的”。如本文中所使用的,精简配置的逻辑地址空间132是指具有超过底层存储资源的物理存储容量的逻辑容量(例如,超过存储介质140的存储容量)的逻辑地址空间132。在一个实施例中,存储层130被配置成用于提供64位逻辑地址空间132(例如,包括2^26唯一LID的逻辑地址空间),该逻辑地址空间可以超过存储介质140的物理存储容量。大的、精简配置的逻辑地址空间132可以允许存储客户端106高效地分配和/或引用LID的连续范围,同时降低命名冲突的可能性。

存储层130的转换模块134可以被配置成用于将逻辑地址空间132的LID映射到存储资源(例如,存储介质140的地址空间144内存储的数据)。逻辑地址空间132可以与后端存储资源(例如,存储介质140)无关;相应地,逻辑地址空间132的LID与存储地址空间144的存储地址之间可能没有设定的或预定的映射。在一些实施例中,逻辑地址空间132是稀疏的、精简配置的、和/或超量配置的,这样使得逻辑地址空间132的大小与存储介质140的存储地址空间144不同。

存储层130可以被配置成用于保持与在存储介质140上执行的存储操作有关的存储元数据135。存储元数据135可以包括但不限于前向映射和反向映射,该前向映射包括逻辑地址空间132的LID与存储地址空间144内的存储地址之间的任意到任意映射,该反向映射与存储介质140的存储位置中的内容、有效性位图、可靠性测试和/或状态元数据、状态信息(例如,出错率、引退状态等等)、高速缓存元数据等等有关。存储元数据135的各部分可以保持在计算系统100的易失性存储器资源102内。可替代地或此外,存储元数据135的各部分可以存储在非易失性存储资源103和/或存储介质140上。

图1B描绘了逻辑地址空间132的LID与存储地址空间144内的后端标识符(例如,存储地址)之间的任意到任意映射150的一个实施例。任意到任意映射150可以被保持在存储元数据135的一个或多个数据结构中。如图1B中所展示的,转换模块134可以被配置成用于将任何存储资源标识符(任何LID)映射到任何后端存储位置上。如进一步展示的,逻辑地址空间132的大小可以被确定为与底层存储地址空间144不同。在图1B的实施例中,逻辑地址空间132可以是精简配置的,并且如此,可以包括比存储地址空间144中的存储地址范围更大的LID范围。

如以上所讨论的,存储客户端106可以通过逻辑地址空间132的LID引用存储资源。相应地,逻辑地址空间132可以与存储资源的逻辑接口152相对应,并且至存储地址空间144内的具体存储地址的映射可以与存储资源的后端接口154相对应。

存储层130可以被配置成用于在前向映射160中保持逻辑接口152与后端接口154之间的任意到任意映射150。前向映射160可以包括任何合适的数据结构,包括但不限于索引、映射、散列映射、散列表、树、范围编码树、b树等等。前向映射160可以包括多个条目162,这些条目与已经分配供引用存储介质140上存储的数据使用的LID相对应。前向映射160中的条目162可以使LID 164A-D与存储地址空间144内的对应的存储地址166A-D相关联。前向映射160可以被稀疏地填充,并且如此,可以省略与当前没有被存储客户端106分配和/或当前用于引用存储介质140上存储的有效数据的LID相对应的条目。在一些实施例中,前向映射160包括范围编码数据结构,这样使得条目162中的一个或多个条目可以与多个LID(例如,LID的范围、长度和/或集合)相对应。在图1B的实施例中,前向映射160包括与被映射到存储地址166A的相应范围上的LID 164A的范围相对应的条目162。这些条目162可以由LID标引。在图1B的实施例中,这些条目162通过对应的链接被安排成树形数据结构。然而,本披露在此方面不受限制,并且可以被适配成使用任何合适的数据结构和/或标引机构。

参照图1C,在一些实施例中,存储介质140可以包括固态存储阵列115,该固态存储阵列包括多个固态存储元件116A-Y。如本文中所使用的,固态存储阵列(或存储阵列)115是指具有两个或更多个独立列118的集合。列118可以包括一个或多个固态存储元件116A-Y,该一个或多个固态存储元件使用尤其互连127以并联方式通信地耦合至存储层130。阵列115中的行117可以包括具有对应列118的物理存储单元(固态存储元件116A-Y)。如本文中所使用的,固态存储元件116A-Y包括但不限于被体现作为封装体、芯片、裸片、平面、印制电路板等等的固态存储资源。包括阵列115的固态存储元件116A-Y可以能够独立操作。相应地,固态存储元件中的第一固态存储元件116A可以能够执行第一存储操作,而第二固态存储元件116B执行不同的存储操作。例如,固态存储元件116A可以被配置成用于读出位于第一物理地址的数据,而另一个固态存储元件116B读出位于不同的物理地址的数据。

固态存储阵列115还可以被称为逻辑存储元件(LSE)。如本文中进一步详细披露的,固态存储阵列115可以包括逻辑存储单元(行117)。如本文中所使用的,“逻辑存储单元”或行117是指两个或更多个物理存储单元的组合,每个物理存储单元在阵列115中的对应列118上。逻辑擦除块是指具有两个或更多个物理擦除块的集合,逻辑页是指具有两个或更多个页的集合等等。在一些实施例中,逻辑擦除块可以包括在对应的逻辑存储元件115和/或存储体内的擦除块。可替代地,逻辑擦除块可以包括多个不同阵列115内的擦除块和/或可以跨越多个固态存储元件的存储体。

参照图1A,存储层130可以进一步包括日志存储模块136,该日志存储模块被配置成用于将数据以日志结构化存储配置形式(例如,以存储日志)存储在存储介质140上。如本文中所使用的,“存储日志”或“日志结构”是指存储介质140的存储地址空间144内的有序数据安排。存储日志中的数据可以包括持久性元数据和/或与其相关联。相应地,存储层130可以被配置成用于以上下文、自描述格式存储数据。如本文中所使用的,上下文或自描述格式是指联合持久性元数据一起存储数据的数据格式。在一些实施例中,持久性元数据可以被配置成用于标识数据,并且如此,可以包括和/或引用数据的逻辑接口(例如,可以包括与数据相关联的LID)。持久性元数据可以包括其他信息,包括但不限于和数据的所有者、访问控制、数据类型、数据的相对位置或偏移有关的信息、与同数据相关联的存储操作(例如,原子存储操作、事务等等)有关的信息、日志序列信息、数据存储参数(例如,压缩算法、加密等)等等。

图1D展示了上下文数据格式的一个实施例。图1D的包格式110包括数据段112和持久性元数据114。数据段112可以具有任何任意长度和/或大小。持久性元数据114可以被体现作为数据包110中的一个或多个头字段。如以上讨论的,持久性元数据114可以包括数据段112的逻辑接口,并且如此,可以包括与数据段112相关联的LID。尽管图1D描绘了包格式110,但本披露在此方面不受限制并且可以用其他方式使数据(例如,数据段112)与上下文元数据相关联,包括但不限于存储介质140上的索引、存储分区索引等等。数据包110可以与序列信息113相关联。该序列信息可以用于确定存储日志内的数据包的相对顺序。在一些实施例中,数据包按顺序被附加在存储介质140的存储分区内。这些存储分区可以与擦除块、逻辑擦除块等等相对应。每个存储分区可以能够存储大量数据包110。存储分区内的数据包110的相对位置可以确定存储日志内的包的顺序。存储分区的顺序可以尤其由存储分区序列信息113确定。可以在存储分区被初始化以便使用(例如,擦除)、被编程、被关闭等等时为存储分区分配对应的序列信息113。存储分区序列信息113可以确定存储地址空间144内的存储分区的有序序列。相应地,存储日志内的数据包110的相对顺序可以由以下内容确定:a)具体存储分区内的数据包110的相对位置和b)存储地址空间144中存储分区相对于其他存储分区的顺序。

在一些实施例中,存储层130可以被配置成用于对不对称、一次写入的存储介质140进行管理,如固态存储介质、闪速存储介质等等。如本文中所使用的,“一次写入”是指每次新数据被写入或在其上被编程时被重新初始化(例如,被擦除)的存储介质。如本文中所使用的,“不对称”存储介质是指针对不同类型的存储操作具有不同延迟的存储介质。在一些实施例中,例如,读出状态可以比写入/编程操作更快,而写入/编程操作可以比擦除操作快得多(例如,读出介质可以比擦除快几百倍,并且比对存储介质进行编程快数十倍)。存储介质140可以被划分成可以按组被擦除的多个存储分区(例如,擦除块)。如此,“在原地(in-place)”修改单个数据段可能需要擦除包括该数据的整个擦除块并且向该擦除块重写入修改后的数据和初始未改变的数据。这可能引起无效率的“写入放大(write amplification)”,这会引起过度损耗介质。在一些实施例中,因此,存储层130可以被配置成用于“不在原地(out-of-place)”写入数据。如本文中所使用的,“不在原地”写入数据是指在不同的存储位置更新和/或覆写数据而不是“在原地”覆写数据(例如,覆写数据的初始物理存储位置)。不在原地更新和/或覆写数据可以避免写入放大,因为擦除块上的现有有效数据和有待修改的数据不需要被擦除和重新拷贝。而且,不在原地写入数据可以从许多存储操作的延迟路径免去擦除,这样使得擦除延迟不是写入操作的“关键路径”的一部分。

存储层130可以被配置成用于通过使用尤其日志存储模块136来不在原地执行存储操作。日志存储模块136可以被配置成用于以保持存储层130执行的存储操作的相对顺序的方式在当前附加点将数据附加在存储地址空间144内,从而在存储介质140上形成“存储日志”。图1E描绘了在存储介质140的存储地址空间144内执行的只附加(append-only)存储操作的一个实施例。如以上所披露的,存储地址空间144包括多个存储分区170A-N(例如,擦除块、逻辑擦除块等等),其中每个存储分区可以被初始化以便在存储数据时使用(例如,被擦除)。如本文中所披露的,存储分区170A-N可以包括对应的存储位置,这些存储位置可以与页、逻辑页等等相对应。可以为这些存储地址分配对应的存储地址(例如,存储地址0至存储地址N)。

日志存储模块136可以被配置成用于从附加点180按顺序将数据存储在物理地址空间144内。在图1E的实施例中,可以在附加点180将数据附加在存储分区170A的存储位置182内,当存储位置182装满时,附加点180可以前进181到下一个可用存储位置。如本文中所使用的,“可用”存储位置是指已经被初始化并且还没有被编程的存储位置(例如,已经被擦除)。如以上披露的,一些类型的存储介质仅可以在擦除之后被可靠地编程一次。相应地,可用存储位置可以是指存储分区170A-N内处于初始化(或被擦除)状态的存储位置。

在图1E的实施例中,由于尤其处于没有处于擦除状态(例如,包括有效数据)、由于出错率高而停止服务等等,逻辑擦除块170B可能不可用于存储。因此,在装满存储位置182之后,日志存储模块136可以跳过不可用的存储分区170B,并且使附加点180前进到下一个可用存储分区170C。如以上披露的,日志存储模块136可以被配置成用于继续向存储位置183-185附加数据,在该点,附加点180在下一个可用存储分区170A-N继续。

在将数据存储在存储地址空间144内的“最后一个”存储位置(例如,存储分区170N的存储位置N 189)上之后,日志存储模块136可以通过绕回第一存储分区170A来使附加点180前进(或者如果存储分区170A不可用,则下一个可用存储分区)。相应地,日志存储模块136可以按照循环或周期处理存储地址空间144。

如以上披露的,按顺序在存储地址空间144内附加数据可以在存储介质140上生成存储日志。在图1E的实施例中,存储日志可以包括通过从附加点180在存储地址空间144内按顺序存储数据包(和/或其他数据结构)而执行的存储操作的有序序列。如以上所披露的,只附加存储格式可以用于不在原地修改和/或覆写数据。不在原地执行存储操作可以避免写入放大,因为存储分区170A-N上包括正被修改和/或覆写的数据的现有有效数据不需要被擦除和/或重新拷贝。而且,不在原地写入数据可以从许多存储操作的延迟路径免去擦除,(擦除延迟不再是写入操作的“关键路径”的一部分)。

在图1E的实施例中,与LID A相对应的数据段X0可以存储在存储位置191。数据段X0可以用以上讨论的自描述包格式110来存储。包110中的数据段112可以包括数据段X0,并且持久性元数据114可以包括与该数据段相关联的LID(例如,LID A)。存储客户端106可以请求修改和/或覆写与LID A相关联的数据的操作,该操作可以包括用数据段X1替换数据段X0。存储层130可以通过在存储介质140上的不同存储位置193附加包括数据段X1的新的包110而不是在原地修改位于存储位置191的现有数据包110而不在原地执行此操作。该存储操作可以进一步包括更新存储元数据135来使LID A与存储位置193的存储地址相关联和/或使位于存储位置191的过时的数据X0失效。如图1E中所展示的,更新存储元数据135可以包括更新前向映射160中的条目以使LID A 164E与修改后的数据段X1的存储地址相关联。

不在原地执行存储操作(例如,将数据附加到存储日志)可以引起过时的或无效的数据保留在存储介质140上(例如,已经被擦除、修改和/或不在原地覆写的数据)。如图1E中所展示的,通过与在存储位置191在原地覆写和/或替换数据段X0相反向存储日志附加数据段X1来修改LID A的数据引起在存储介质140上保持数据段X0的过时版。数据段X0的过时版可能不立即从存储介质140中被移除(例如,被擦除),因为如以上披露的,擦除数据段X0可能涉及擦除整个存储分区170A和/或在存储分区170A上重新安置有效数据,这是一项耗时操作并且可能引起写入放大。类似地,不再使用的数据(例如,被删除或经历TRIM(裁剪)操作)可能不被立即移除。如此,随着时间推移,存储介质140可能累积大量“无效”数据。

存储层130可以通过使用存储元数据135(例如,前向映射160)标识无效数据,如位于存储位置191的数据段X0。存储层130可以确定不与前向映射160中的有效标识符(LID)相关联的存储位置包括不需要保留在存储介质140上的数据。可替代地或此外,存储层130可以保持其他存储元数据135,如有效性位图、反向映射、等等,以便高效地标识已经被删除、已经被裁剪、过时和/或以其他方式无效的数据。

存储层130可以被配置成用于收回无效数据占用的存储资源。存储层130可以被进一步配置成用于执行其他介质管理操作,包括但不限于刷新存储在存储介质140上的数据(以防止由于数据退化、写入干扰、读出干扰等等引起的错误状况)、检测介质可靠性状况等等。如本文中所使用的,收回存储资源(如存储分区170A-N)是指擦除存储分区170A-N,从而使得新数据可以存储/编程在其上。收回存储分区170A-N可以包括将存储分区170A-N上的有效数据重新安置到新的存储位置。存储层130可以基于一个或多个因素来标识供收回的存储分区170A-N,该一个或多个因素可以包括但不限于存储分区170A-N中的无效数据量、存储分区170A-N中的有效数据量、耗损等级(例如,编程/擦除周期数量)、自存储分区170A-N被编程或刷新以来的时间等等。

存储层130可以被配置成用于通过使用存储介质140上的存储日志的内容来重构存储元数据135,包括前向映射160。在图1E实施例中,与LID A相关联的数据的当前版可以分别基于位于存储位置191和193的数据包110的相对日志顺序来确定。由于在存储日志中,位于存储位置193的数据包被排序在位于存储位置191的数据包之后,存储层130可以确定存储位置193包括与LID A相对应的数据的最近、最新版。存储层130可以重构前向映射160以使LID A与位于存储位置193的数据包相关联(而不是位于存储位置191的过时的数据)。

图2描绘了包括存储层130的系统200的另一个实施例。存储介质140可以包括多个独立存储体119A-N,其中每个独立存储体可以包括一个或多个存储阵列115A-N。每个独立存储体119A-N可以经由互连127耦合至存储控制器139。

存储控制器139可以包括被配置成用于经由总线127接收来自存储层130的存储请求的存储请求接收器模块231。存储请求接收器231可以被进一步配置成用于向/从存储层130和/或存储客户端106转移数据。相应地,存储请求接收器模块231可以包括一个或多个直接存储器存取(DMA)模块、远程DMA模块、总线控制器、网桥、缓冲器等等。

存储控制器139可以包括写入模块240,该写入模块被配置成用于响应于经由请求模块231接收的请求而将数据存储在存储介质140上。存储请求可以包括和/或引用与这些请求有关的数据的逻辑接口。写入模块240可以被配置成用于将数据存储在自描述存储日志中,如以上所披露的,该自描述存储日志可以包括按顺序将数据包110附加在存储介质140的存储地址空间144内。数据包110可以包括和/或引用数据的逻辑接口(例如,可以包括与该数据相关联的LID)。写入模块240可以包括被配置成用于处理供存储的数据的写入处理模块242。处理供存储的数据可以包括以下各项中的一项或多项:a)压缩处理;b)加密处理;c)将数据封装到对应的数据包110中(和/或其他容器);d)执行纠错码(ECC)处理等等。写入缓冲器244可以被配置成用于缓冲供存储在存储介质140上的数据。在一些实施例中,写入缓冲器244可以包括被配置成用于使存储控制器139的时钟域与存储介质140的时钟域同步的一个或多个同步缓冲器(和/或互连127)。

日志存储模块136可以被配置成用于为数据存储操作选择存储位置并且可以向独立存储体119A-N的存储阵列115A-N提供寻址和/或控制信息。如本文中披露的,日志存储模块136可以被配置成用于以日志格式按顺序将数据附加在存储介质140的存储地址空间144内。

写入数据的存储操作可以包括:a)将一个或多个数据包附加到存储介质140上的存储日志上和b)更新存储元数据135以使数据的LID与一个或多个数据包的存储地址相关联。在一些实施例中,存储元数据135可以保持在存储控制器139的存储器资源上(例如,保持在包括存储介质140的存储装置141的专用易失性存储器资源上)。可替代地或此外,存储元数据135的各部分可以保持在存储层130内(例如,在图1A中的计算装置110的易失性存储器112上)。在一些实施例中,存储元数据135可以通过存储层130保持在易失性存储器中并且可以定期存储在存储介质140上。

存储控制器139可以进一步包括数据读出模块241,该数据读出模块被配置成用于响应于经由存储请求接收器模块231接收的请求而从存储介质140上的存储日志读出数据。这些请求可以包括所请求的数据的LID、所请求的数据的存储地址等等。读出模块241可以被配置成用于:a)通过使用尤其前向映射160来确定包括所请求的数据的数据包110的存储地址;b)从存储介质140上的所确定的存储地址读出数据包110;以及c)处理数据以供请求实体使用。从存储介质140读出的数据可以经由读出缓冲器245流式传输到读出模块241中。读出缓冲器245可以包括如以上所描述的用于时钟域同步的一个或多个读出同步缓冲器。读出处理模块243可以被配置成用于处理从存储介质140读出的数据,其可以包括但不限于以下各项中的一项或多项:a)解压处理;b)解密处理;c)从一个或多个数据包110(和/或其他容器)提取数据;d)执行ECC处理等等。

存储控制器139可以进一步包括存储体控制器252,该存储体控制器被配置成用于向/从具体的独立存储体119A-N选择性地路由写入模块240和/或读出模块241的数据和/或命令。在一些实施例中,存储控制器139被配置成用于在独立存储体119A-N之间交叉存储操作。存储控制器139可以在来自写入模块240的数据正在被编程到存储体119B的存储阵列115B的同时(例如)从存储体119A的存储阵列115A读出到读出模块241中。大卫·弗林(David Flynn)等人的2006年12月12日提交的标题为“Apparatus,System,and Method for Managing Commands for Solid-State Storage Using Bank Interleave(用于使用存储体交叉来管理固态存储命令的设备、系统和方法)”的美国专利申请序列号11/952,095中披露了多存储体存储操作的进一步的实施例,该申请通过引用结合于此。

写入处理模块242可以被配置成用于将数据包110编码成ECC码字。如本文中所使用的,ECC码字是指数据和相应的错误检测和/或校正信息。写入处理模块242可以被配置成用于实现任何合适ECC算法和/或生成任何合适类型的ECC码字,其可以包括但不限于数据段和相应的ECC综合征、ECC符号、ECC分块、和/或其他结构化和/或未结构化ECC信息。ECC码字可以包括但不限于任何合适的纠错编码,包括但不限于块ECC编码、卷积ECC编码、低密度奇偶校验(LDPC)编码、加拉格尔编码、所罗门编码、汉明码、多维奇偶编码、循环纠错码、BCH码等等。写入处理模块242可以被配置成用于生成具有预定大小的ECC码字。相应地,单个数据包可以被编码成多个不同的ECC码字,和/或单个ECC码字可以包括两个或更多个包的多个部分。可替代地,写入处理模块242可以被配置成用于生成任意大小的ECC码字。杰里米·菲林姆(Jeremy Fillingim)等人的2013年3月14日提交的标题为“Systems and Methods for Adaptive Error-Correction Coding(用于自适应纠错编码的系统和方法)”的美国专利申请序列号13/830,652中披露了纠错码处理的进一步实施例,该申请通过引用以其全部内容结合于此。

在一些实施例中,存储层130利用逻辑地址空间132以便高效地实现高级存储操作。存储层130可以被配置成用于实现“克隆”或“逻辑拷贝”操作。如本文中所使用的,“克隆”或“逻辑拷贝”是指高效地拷贝或复制存储层130管理的数据。克隆操作可以包括创建与和“初始”LID集合相同的数据相对应的“克隆”LID集合。因此,克隆操作可以包括使用两个(或更多个)不同的逻辑接口引用同一存储位置集合(例如,不同的LID集合)。因此,克隆操作可以修改存储在存储介质140上的一个或多个数据包110的逻辑接口。“逻辑移动”可以是指修改存储层130管理的数据的逻辑接口。逻辑移动操作可以包括改变用于引用存储在存储介质140上的数据的LID。“合并”操作可以包括合并逻辑地址空间132的不同部分。如本文中进一步详细披露的,克隆和/或移动操作可以用于高效地实现更高级的存储操作,如去重复、快照、逻辑拷贝、原子操作、事务等等。

参照图3A,存储层130可以包括逻辑接口管理模块334,该逻辑接口管理模块被配置成用于管理与存储层130管理的数据有关的逻辑接口操作,如克隆操作、移动操作、合并操作等等。克隆LID可以包括修改存储在存储介质140中的数据的逻辑接口,以便尤其允许通过使用两个或更多个不同的LID集合来引用数据。相应地,创建克隆品可以包括:a)将LID集合分配在逻辑地址空间132(或其专用部分)中以及b)通过使用尤其存储元数据135使所分配的LID与和“初始”LID集合相同的存储位置相关联。因此,创建克隆品可以包括向被配置成用于使新的克隆LID集合与具体存储位置集合相关联的前向映射160添加一个或多个条目。

逻辑接口管理模块334可以被配置成用于根据克隆同步策略来实现克隆操作。克隆同步策略可以用于确定参照多个克隆品或副本中的第一克隆品或副本执行的操作如何传播到其他克隆品或副本。例如,克隆品可以关于分配操作被同步化,这样使得对扩展克隆品之一的请求包括扩展其他克隆品或副本。如本文中所使用的,扩展文件(或其他数据段)是指增加文件的大小、范围和/或长度,其可以包括向克隆品添加一个或多个逻辑标识符、修改分配给克隆品的逻辑标识符中的一个或多个逻辑标识符等等。克隆同步策略可以包括合并策略,该合并策略可以尤其确定当克隆品在合并和/或折叠操作中被组合时克隆品之间的不同如何被管理(以下另外详细进行披露)。

图3A描绘了存储层130实现的范围克隆操作的一个实施例。图3A中的范围克隆操作可以响应于来自存储客户端106的请求而被实现。在一些实施例中,存储层130的接口131可以被配置成用于提供接口和/或API用于执行克隆操作。可替代地或此外,范围克隆操作可以作为更高级操作的一部分而被执行,如原子操作、事务、快照、逻辑拷贝、文件管理操作等等。

如图3A中所展示的,存储层130中的前向映射160包括条目362,该条目被配置成用于将LID 1024-2048与介质存储位置3453-4477绑定。图3A省略了其他条目以避免使所描绘的实施例的细节模糊。如本文中披露的,条目362及其绑定项可以定义逻辑接口311A,通过该逻辑接口,存储客户端106可以引用相应的数据(例如,数据段312);存储客户端106可以通过使用LID 1024-2048通过存储层130来访问和/或引用数据段312(和/或其多个部分)。相应地,LID 1024-2048定义尤其数据段312的逻辑接口311A。

如本文中披露的,存储层130可以被配置成用于将上下文格式的数据存储在存储介质140上(例如,包格式110)。在图3A的实施例中,位于存储位置3453-4477的数据包310包括数据段312。数据包310进一步包括指示数据段312的逻辑接口的持久性元数据314(例如,使数据段312与LID1024-2048相关联)。如以上所披露的,联合描述性、持久性元数据一起存储数据可以使存储层130能够用存储日志的内容重建前向映射160(和/或其他存储元数据135)。在图3A的实施例中,可以通过使存储在存储地址3453-4477的数据与包310的持久性元数据314引用的LID 1024-2048相关联来重构条目362。尽管图3A描绘了单个包310,但本披露在此方面不受限制。在一些实施例中,条目362的数据可以存储在多个不同的包310中,每个包包括对应的持久性元数据314(例如,每个存储位置的单独的包等)。

逻辑接口管理模块334可以被配置成用于通过尤其分配与有待克隆的初始LID相对应的新的LID集合并且使这些新的LID与初始源LID的存储位置绑定来克隆条目362。如图3B中所展示的,创建LID 1024-2048的克隆品可以包括逻辑接口管理模块334分配等量的LID 6144-7168的集合并且将克隆标识符集合与存储地址3453-4477绑定。因此,创建克隆品可以包括修改存储元数据135以将数据段312的逻辑接口311B扩展成包括LID 6144-7168而不需要在存储介质140上拷贝和/或复制底层数据段312。

数据段312的经修改的逻辑接口311B可能与存储在存储位置3453-4477的相应数据包310的上下文格式不一致。如以上所披露的,数据包310的持久性元数据314引用LID 1024-2048,但不包括和/或不引用克隆的LID6144-7168。数据段312的上下文格式可以被更新成与经修改的逻辑接口311B(例如,被更新成使数据与LID 1024-2048和6144-7168相关联,与只有LID 1024-2048相反),其可以包括以使数据段与这两个LID集合相关联的包格式重新写入数据段。如果存储装置141是随机存取、原地写入存储装置,则持久性元数据314可以在原地被更新。在包括一次写入、不对称的存储介质140的其他实施例中,这种原地更新可能效率低。因此,存储层130可以被配置成用于以不一致上下文格式保持数据直至数据在介质管理操作中被重新安置,如存储恢复、重新安置、等等(通过介质管理模块370)。更新数据段312的上下文格式可以包括将数据段312重新安置和/或重新写入在存储介质140上,如果数据段312较大和/或克隆品包括大量LID,这可能是耗时的过程并且可能效率特别低。因此,在一些实施例中,存储层130可以推迟更新克隆数据段312的上下文格式和/或可以在一个或多个后台操作中更新上下文格式。同时,存储层130可以被配置成用于提供对以不一致的上下文格式格式存储时的数据段312(数据包310)的访问。

存储层130可以被配置成用于确认在相应数据段312的上下文格式被更新之前克隆操作完成。该数据可以随后以更新后的上下文格式被重新写入(例如,重新安置)在存储介质140上。该更新可以在克隆操作和/或其他前台存储操作的“关键路径”之外进行。在一些实施例中,数据段312被介质管理模块370重新安置,作为存储恢复进程、数据更新操作、等等中的一项或多项的一部分。相应地,存储客户端106可以能够通过经修改的逻辑接口311B访问数据段312(例如,引用LID 1024-2048和/或6144-7168)而不等待有待根据经修改的逻辑接口311B被更新的数据段312的上下文格式。

数据段312的经修改的逻辑接口311B可以仅存在于存储元数据135(例如,映射160)中,直至数据段312的上下文格式在存储介质140上被更新。因此,如果前向映射160由于尤其电源故障或数据损坏而丢失,可能不在重构的存储元数据135中反映克隆操作(克隆操作可能不持久和/或不防崩溃(crash safe))。如以上展示的,数据包310中的持久性元数据314指示数据段312仅与LID 1024-2048、而不与6144-7168相关联。因此,只有条目362将被重构(如图3A),并且条目362将被省略;因此,后续通过经修改的逻辑接口311B(例如,通过6144-7168)访问数据段312的尝试可能失败。

在一些实施例中,克隆操作可以进一步包括将持久性注释存储在存储介质140上以便使克隆操作持久和/或防崩溃。如本文中所使用的,“持久性注释”是指存储在存储介质140上的元数据。如本文中所披露的,持久性注释366可以与日志顺序相对应和/或可以用包格式存储。持久性注释366可以包括对数据段312的经修改的逻辑接口311B的指示。在图3B的实施例中,与所描绘的克隆操作相对应的持久性注释366可以被配置成用于使存储在存储地址3453-4477的数据与这两个LID 1024-2048和6144-7168范围相关联。在用存储介质140的内容重构前向映射160的过程中,持久性注释366可以用于将这两个条目362和364重构成使数据段312与更新后的逻辑接口311B的这两个LID范围相关联。在一些实施例中,存储层130可以响应于更新存储元数据135(例如,创建条目364)和将持久性注释366存储在存储介质140上而确认克隆操作完成。响应于将数据段312的上下文格式更新成与更新后的逻辑接口311B一致,可以使持久性注释366失效和/或被标记以便从存储介质140中移除(例如,如以上披露的,重新安置和/或重新写入数据段312)。

在一些实施例中,数据段312的更新后的上下文格式可以包括使数据段312与这两个LID范围1024-2048和6144-7168相关联。图3C描绘了数据段312的更新后的上下文格式(数据包320)的一个实施例。如图3C中展示的,数据包320的持久性元数据324使数据段312与更新后的逻辑接口311B的这两个LID范围1024-2048和6144-7168相关联。数据包320可以不在原地被写入在与初始数据包310不同的存储地址(64432-65456),这可以在前向映射160中的更新后的条目362和364中得到反映。响应于将数据包320附加至存储日志,可以使相应的持久性注释366(如果有的话)失效(被移除和/或被标记以便随后从存储介质140中移除)。在一些实施例中,移除持久性注释366可以包括发出一条或多条裁剪消息,指示持久性注释366不再需要被保留在存储介质140上。可替代地或此外,前向映射160的各部分可以存储在持久性、防崩溃存储位置(例如,非瞬态存储资源103和/或存储介质140)中。响应于持久化前向映射160(例如,条目362和364),如以上所披露的,可以使持久性注释366失效,即使数据段312还没有以更新后的上下文格式被重新写入。

逻辑接口管理模块334可以被配置成用于根据一个或多个不同模式(包括“写时拷贝模式”)来实现克隆操作。图3D描绘了以写时拷贝模式在克隆范围内执行的存储操作的一个实施例。在写时拷贝模式下,在创建克隆品之后进行的存储操作可能引起克隆品与彼此偏离(例如,条目362和364可以是指不同的存储地址、范围和/或长度)。在图3D的实施例中,存储层130已经以更新后的上下文格式(包320)写入数据段312,该上下文格式被配置成用于使数据段312与这两个LID范围1024-2048和6144-7168相关联(如图3C中所描绘的)。然后,存储客户端106可以发出修改和/或覆写与LID6657-7168相对应的数据的一个或多个存储请求。在图3D的实施例中,存储请求包括修改和/或覆写LID 6657-7168的数据。作为响应,存储层130可以将新的和/或经修改的数据存储在存储介质140上,如以上所披露的,这可以包括向存储日志附加新的数据包340。数据包340可以使数据段342与LID6657-7424相关联(例如,通过使用包340中的持久性元数据344)。前向映射160可以被更新成使LID 6657-7424与数据段342相关联,这可以包括将条目364分成被配置成继续引用数据段312中的数据的未修改的部分的条目365和引用存储在存储地址78512-79024的新数据段342的条目367。在图3D中所描绘的写时拷贝模式下,与LID 1024-2048相对应的条目362可以不变,并且继续引用位于存储地址64432-65456的数据段312。尽管没有在图3D中描绘,但范围1024-2048内的修改可能引起对条目362造成影响的类似偏离变化。而且,存储请求不局限于修改和/或覆写数据。其他操作可以包括扩展LID集合(附加数据)、移除LID(删除、截短和/或裁剪数据)等等。

在一些实施例中,存储层130可以支持其他克隆模式,如“同步化克隆”模式。在同步化克隆模式下,在克隆LID范围内做出的变化可以在一个或多个其他相应的范围内得到反映。在图3D的实施例中,如本文中所披露的,以“同步化克隆”模式实现所描述的存储操作可以包括将条目362更新成引用新的数据段342,其可以尤其包括将条目362分成被配置成用于使LID1024-1536与初始数据段312的多个部分相关联的条目和添加被配置成用于使LID 1537-2048与新的数据段342相关联的条目。

返回参照图3D中的写时拷贝实施例,逻辑接口管理模块334可以被进一步配置成用于管理克隆合并操作。如本文中所使用的,“合并”或“克隆合并”是指将两个或更多个不同的LID集合和/或范围组合的操作。在图3D的实施例中,范围合并操作可以包括将条目362与相应的克隆条目365和367合并。逻辑接口管理模块334可以被配置成用于根据合并策略实现范围合并操作,如:写入顺序策略,在该策略下,较新的变化覆盖更早的变化;基于存储操作的相对优先级的基于优先级的策略(例如,基于存储客户端106的特性、应用、和/或与存储操作相关联的用户);完成指示符(例如,原子存储操作完成、原子存储操作失败等等);fadvise参数;ioctrl参数;等等。

图3E描绘了范围合并操作的一个实施例。图3E中的范围合并操作可以包括将范围6144-6656并入范围1024-2048。相应地,范围合并操作可以包括根据合并策略选择性地应用在LID范围6144-6656内对LID范围1024-2048作出的变化。因此,范围合并操作可以包括将LID范围1024-2048更新成使LID 1537-2048与包括新的/经修改的数据段342的存储地址78512-79024相关联。该更新可以包括在前向映射160中使条目362分开;条目372可以被配置成用于使LID 1024-1536与初始数据段312的多个部分相关联,并且条目373可以被配置成用于使LID 1537-2048与新的数据段342相关联。如本文中所披露的,可以使数据段312的不再被LID 1537-2048引用的部分失效。并入初始源范围中的LID范围6144-7168可以被解除分配和/或从前向映射160中移除。

图3E中所展示的范围合并操作可以引起修改至数据的各部分的逻辑接口311C。数据段342的上下文格式(数据包340)可以使数据段342与LID6657-7168相关联,而不是与合并后的LID 1537-2048相关联。如以上所披露的,存储层130可以提供对以不一致的上下文格式存储的数据段342的访问。存储层130可以被配置成用于以更新后的上下文格式存储数据段342,在该格式下,在一个或多个后台操作(例如,存储恢复操作)中,数据段342与LID 1537-2048相关联。在一些实施例中,范围合并操作可以进一步包括将持久性注释366存储在存储介质140上以使数据段342与更新后的逻辑接口311C相关联(例如,使位于存储地址78512-79024的数据段342与LID1537-2048相关联)。如以上所披露的,持久性注释366可以用于确保范围合并操作是持久的并且防崩溃。可以响应于以与逻辑接口311C一致的上下文格式重新安置数据段342(例如,使数据段342与LID 1537-2048相关联)、使前向映射160持久化等等而移除持久性注释366。

结合图3A-E披露的克隆操作可以用于实现其他逻辑操作,如范围移动操作。往回参照图3A-C,用于复制前向映射160中的条目362的克隆操作可以包括将与数据段312相关联的逻辑接口修改成使数据段312与(条目364的)初始LID 1024-2048的集合与新的克隆LID 6144-7168的集合两者相关联。该克隆操作可以进一步包括在一个或多个后台存储操作中存储指示数据段312的更新后的逻辑接口311B的持久性注释366和/或根据更新后的逻辑接口311B重新写入数据段312。

逻辑接口管理模块334可以被进一步配置成用于实现“范围移动”操作。如本文中所使用的,“范围移动”操作是指将一个或多个数据段的逻辑接口修改成使这些数据段与不同的LID集合相关联。因此,范围移动操作可以包括将存储元数据135(例如,前向映射160)更新成使该一个或多个数据段与更新后的逻辑接口相关联、将指示数据段的更新后的逻辑接口的持久性注释366存储在存储介质140上、并且以与更新后的逻辑接口一致的上下文格式(数据格式310)重新写入这些数据段。相应地,存储层130可以使用与以上结合图3A-E披露的那些相同的机制和/或处理步骤来实现范围移动操作。

图3A-E中披露的克隆和/或范围移动操作可以对存储层130加以某些限制。如以上所披露的,以上下文格式存储数据可以包括使数据与引用该数据的每个LID相关联。在图3C的实施例中,持久性元数据324包括对这两个LID范围1024-2048和6144-7168的引用。因此,增加对数据段的引用数量可能强行使上下文数据格式的开销相应增加(例如,增加持久性元数据324的大小)。在一些实施例中,持久性元数据314的大小可能受到限制,这可以限制可以引用具体数据段312的引用和/或克隆数量。而且,包含对不同LID的多次引用可能使存储恢复操作复杂。重新安置数据段312时需要更新的前向映射条目的数量可以根据引用数据段312的LID的数量而变化。往回参照图3C,在梳理和/或存储恢复操作中重新安置数据段312可以包括更新两个单独条目362和364。重新安置N个不同的LID(例如,N个不同的克隆品)引用的数据段可以包括更新前向映射160中的N个不同的条目。类似地,存储数据段可以包括将N个条目写入持久性元数据314中。这种可变开销可能降低后台存储恢复操作的性能并且可能限制可以支持的并发克隆和/或引用的数量。

在一些实施例中,逻辑接口管理模块334可以包括和/或利用中间映射层以减小克隆操作强加的开销。中间映射层可以包括被配置成用于促进高效克隆操作(以及本文中进一步详细披露的其他操作)的“引用条目”。如本文中所使用的,“引用条目”是指用于引用前向映射160中的其他条目的映射数据结构的条目(和/或其他存储元数据135)。引用条目只有在其被逻辑地址空间132内的一个或多个其他条目引用时才可能存在。在一些实施例中,引用条目可能对于存储客户端106而言是不可访问的和/或可能是不可改变的。存储层130可以利用引用条目以允许存储客户端经由单个引用条目接口通过多个不同的逻辑接口引用同一数据集。存储介质140上的数据的上下文格式(被多个LID引用的数据)可以被简化成使数据与引用条目相关联,这些引用条目进而通过其他持久性元数据(例如,持久性注释366)与N个其他逻辑接口相关联。因此,重新安置克隆数据可以包括更新引用条目与数据段的新的存储地址之间的单个映射。

图4A是用于高效的打开至关闭一致性的系统400的另一个实施例的框图。系统400包括存储层130,该存储层被配置成用于通过使用中间映射层来实现范围克隆操作。存储元数据135可以包括与逻辑地址空间132有关的前向映射160。如以上所披露的,前向映射160(和/或其他存储元数据135)可以包括与存储客户端106对逻辑地址空间的分配、LID与存储地址空间144内的存储地址之间的绑定等等有关的信息。

在图4A的实施例中,逻辑接口管理模块334可以包括被配置成用于通过使用引用映射460来管理克隆操作的引用模块434。引用映射460可以包括与被逻辑地址空间132的一个或多个逻辑接口(例如,一个或多个LID集合)引用的数据相对应的引用条目。引用模块434可以被配置成用于移除不再用于引用有效数据和/或不再被前向映射160内的条目引用的引用条目。如图4A中所展示的,可以与前向映射160分开(例如,在单独引用映射460中)来保持引用条目。这些引用条目可以通过使用引用标识符来标识,这些引用标识符可以保持在与逻辑地址空间132分开的命名空间中。相应地,引用条目可以是与逻辑地址空间132分开且不同的中间、“虚拟”或“引用”地址空间432的一部分,该逻辑地址空间可由存储客户端106通过存储层接口131直接访问。可替代地,在一些实施例中,可以为引用条目分配从逻辑地址空间132的不可由存储客户端106直接访问的预定范围和/或部分中选择的LID。

逻辑接口管理模块334可以被配置成用于通过使前向映射160中的一个或多个LID条目与引用映射460中的引用条目相链接来实现克隆操作。这些引用条目可以绑定到克隆数据的存储地址上。相应地,与克隆数据相关联的LID可以通过引用映射460(例如,LID可以映射到进而映射到存储地址上的引用条目上)来间接引用底层数据。相应地,前向映射160中的与克隆数据相对应的条目可以被称为“间接条目”。如本文中所使用的,“间接条目”是指前向映射160中的引用引用映射460中的引用条目和/或与其链接的条目。间接条目可以分配有逻辑地址空间132内的LID,并且可以由存储客户端106访问。

如以上所披露的,在克隆具体LID集合之后,存储客户端106可以在这些克隆范围中的一个或多个克隆范围内执行存储操作,这些操作可以引起克隆品与彼此偏离(根据克隆模式)。在“写时拷贝”模式下,对具体克隆品所做的变化可能在其他克隆范围中得不到反映。在图4A的实施例中,对克隆品所做的变化可以在与间接条目相关联的“本地”条目中得到反映。如本文中所使用的,“本地条目”是指直接映射到存储介质140的一个或多个存储地址上的间接条目。相应地,本地条目可以被配置成用于引用在具体克隆品中已经被改变和/或与其他克隆品的内容不同的数据。因此,本地条目可以与对于具体克隆品而言是唯一的数据相对应。

转换模块134可以被配置成用于通过使用尤其引用映射460和/或引用模块434来访问与克隆数据相关联的数据。转换模块134可以实现级联查找,这可以包括首先遍历本地条目,并且如果没有在本地条目中找到目标前向标识符,则继续在间接条目与其相链接的引用条目内遍历。

日志存储模块136和介质管理模块370可以被配置成用于管理克隆数据的上下文格式。在图4A的实施例中,克隆数据(被前向映射160内的两个或更多个LID范围引用的数据)可以用使该数据与引用映射460的一个或多个引用条目相关联的上下文格式来存储。与这种克隆数据段一起存储的持久性元数据可以与单个引用条目相对应,与标识与数据段相关联的每个LID相反。因此,创建克隆品可以包括通过使用尤其以上所披露的介质管理模块370在一个或多个后台操作中更新克隆数据的上下文格式。

图4B使用引用映射460描绘了克隆操作的一个实施例。在状态413A下,与逻辑地址空间132中的LID 10长度2相对应的条目(在图4B中用10,2表示)可以直接引用位于存储介质140上的逻辑地址20000的数据。图4B省略了其他条目以避免使所披露的实施例的细节模糊。在状态413B下,存储层130实现用于克隆范围10,2的操作。克隆范围10,2可以包括:a)在逻辑地址空间内分配新的LID范围(在图4B中用400,2表示)并且b)在引用映射460中分配引用条目,通过该引用映射,条目10,2和400,2可以引用位于存储地址20000的克隆数据(在图4B中用100000,2表示)。如在状态413C所展示的,克隆操作可以进一步包括使条目10,2和400,2与引用条目100000,2相关联。如以上所披露的,使条目10,2和400,2与引用条目100000,2相关联可以包括指示条目10,2和400,2是间接条目。状态413C可以进一步包括将持久性注释366存储在存储介质140上以使位于存储地址20000的数据与引用条目100000,2相关联和/或使条目10,2和400,2与引用映射460中的引用条目100000,2相关联。

存储层130可以提供通过LID 10或400(通过引用条目100000,2)对位于存储地址20000的数据段的访问。响应于和LID 10或400有关的请求,转换模块134可以确定前向映射160中的相应条目是与引用映射460中的条目相关联的间接条目。作为响应,引用模块434通过前向映射160中的本地条目(如果有的话)和引用映射460中的相应引用条目(例如,引用条目100000,2)执行级联以确定存储地址。

在步骤413C创建克隆品可以包括将存储在步骤20000的数据段的逻辑接口修改成使数据与这两个LID范围10,2和400,2相关联。然而,该数据的上下文格式可以仅使该数据与LID 10,2相关联。如以上所披露的,创建克隆品可以进一步包括将持久性注释366存储在存储介质140上以通过引用条目100000,2使数据段与LID 10,2和400,2相关联。在介质管理模块370执行的一个或多个后台操作中,可以用更新后的上下文格式重新写入数据段。与单独LID范围10,2和400,2相反,该数据可以与使该数据段与引用条目100000,2相关联的持久性元数据314一起存储。因此,与和引用数据的每个LID范围相对应的多个条目(例如,多个条目10,2和400,2)相反,重新安置数据段(如在状态413D中所示)可以仅需要更新引用映射460中的单个条目。而且,前向映射160中的任何数量的LID范围都可以引用数据段,而不需增加与存储介质140上的数据相关联的持久性元数据314的大小和/或使介质管理模块370的操作复杂。

图4C描绘了使用引用条目实现的克隆操作的另一个实施例。响应于创建LID 1024-2048和/或数据段312的克隆品的请求,逻辑接口管理模块334可以被配置成用于在引用映射460中分配引用条目482来表示数据段312。前向映射160中的任何数量的LID范围都可以通过引用条目482来引用数据,而不需增加与数据段312相关联的持久性元数据的开销和/或使介质管理模块370的操作复杂。如图4C中所描绘的,引用条目482可以绑定到数据段312的存储地址(存储地址64432-65456)上。前向映射160中的条目462和472可以通过引用条目482(例如,可以如图4C中所展示的与引用条目482相链接)间接引用存储地址。

在图4C的实施例中,为引用条目482分配标识符0Z-1024Z。引用条目482的标识符可以与逻辑地址空间132的具体部分相对应或者可以与不同的单独命名空间相对应。存储层130可以通过使用尤其与条目462和/或472相关联的元数据来使条目462和472与引用条目482相链接。可替代地或此外,间接条目462和/或472可以用对引用条目482的引用和/或链接来替换存储地址元数据。引用条目482不可以由存储客户端106经由存储层130直接访问。

克隆操作可以进一步包括修改数据段312的逻辑接口311D;经修改的逻辑接口311D可以允许通过间接条目462的LID 1024-2048和/或间接条目472的6144-7168来引用数据段312。尽管引用条目482不可以由存储客户端106访问,但引用条目482可以用于通过转换模块134访问该数据(通过间接条目462和472),并且如此,可以被认为是数据段312的经修改的逻辑接口311B的一部分。

克隆操作可以进一步包括将持久性注释366A存储在存储介质140上。如以上所披露的,持久性注释366A和/或366B的存储可以确保克隆操作是持久的并且防崩溃。持久性注释366A可以被配置成用于标识与数据段312相关联的引用条目482。相应地,持久性注释366A可以使存储地址64432-65456与引用条目标识符0Z-1024Z相关联。克隆操作可以进一步包括存储被配置成用于使条目462和472的LID与引用条目482相关联的另一个持久性注释366B。可替代地,与条目462、472和482之间的关联有关的元数据可以包括在单个持久性注释中。持久性注释366A和/或366B可以保留在存储介质140上,直至以更新后的上下文格式重新安置数据段312和/或使前向映射160(和/或引用映射460)持久化。

数据段312的经修改的逻辑接口311D可以与上下文格式的初始数据包410A不一致;持久性元数据314A可以引用LID 1024-2048而不是引用条目482和/或克隆条目472。存储层130可以被配置成用于以与经修改的逻辑接口311D一致的更新后的上下文格式(包410B)存储数据段312;与分开标识每个克隆范围内的LID(例如,条目462和472)相反,持久性元数据314B可以使数据段312与引用条目482相关联。相应地,间接条目482的使用允许数据段312的逻辑接口311D包括任何数量的LID,而不受持久性元数据314A-B的大小限制的约束。而且,可以在不更新数据段312的上下文格式的情况下制作引用条目482的附加克隆品;可以通过使新的LID范围与前向映射160中的引用条目482相关联和/或通过使用尤其持久性注释366来进行这种更新。

如以上所披露的,间接条目462和472可以通过引用条目482最初引用数据段312。在克隆操作之后执行的存储操作可以通过使用前向映射160内的本地条目而得到反映。在克隆操作完成之后,存储层130可以修改与一个或多个克隆LID相关联的数据。在图4D的实施例中,存储客户端106修改和/或覆写与间接条目462的LID 1024-1052相对应的数据,这可以包括向存储日志(在位于存储地址7823-7851的数据包420中)附加新的数据段412。

可以用包括被配置成用于使数据段412与LID 1024-1052相关联的持久性元数据414A的上下文格式(数据包420)存储数据段412。存储层130可以被配置成用于使数据段412与本地条目465中的LID 1024-1052相关联。与通过间接条目462和/或引用条目482引用数据相反,本地条目465可以直接引用更新后的数据。

响应于和数据1024-1052(或其子集)有关的请求,逻辑接口管理模块334可以在级联查找操作中搜索对所请求的LID的引用,这可以包括搜索对引用条目之后的本地条目(如果可用的话)的引用。在图4D的实施例中,本地条目465可以用于满足与LID范围1024-1052(存储地址7823-7851)而不是每个引用条目462的64432-64460有关的请求。可以继续通过引用条目482来服务对没有在本地条目中找到的LID(例如,LID 1053-2048)的请求。因此,与范围1024-2048有关的数据的逻辑接口311E可以包括一个或多个本地条目465、一个或多个间接条目462和/或一个或多个引用条目482。

在图4E中所展示的进一步实施例中,存储层130可以通过逻辑接口311E的LID中的另一者(例如,LID 6144-6162)来修改克隆品的数据;图4E中没有示出逻辑接口定界符以避免使所示实施例的细节模糊。如以上所披露的,可以使用本地条目475来引用经修改的数据。在图4E的实施例中,范围462和472中的每个范围具有通过引用条目482的标识符0Z-52Z之前被引用的、其自己对应的本地数据版。如此,条目462和472都不包括对范围0Z-52Z的引用。引用模块434可以确定相应数据(和引用标识符)不再被引用,并且如此,可以被标记以便从存储介质140中移除(例如,失效)。如图4E中所描绘的,使数据失效可以包括通过尤其将引用条目482修改成移除范围0Z-52Z来将对数据的引用从引用映射460中移除。使数据失效可以进一步包括更新其他存储元数据135,如反向映射、有效性位图等等(例如,指示存储在存储地址64432-64484的数据不需要被保留)。条目462和472的范围可以继续偏离,直至两者都不对引用条目482的任何部分进行引用,这时,如以上所披露的,可以移除引用条目482并且由此可以使所引用的数据失效。

尽管图4D和图4E描绘了包括与相应间接条目462和472重叠的LID范围的本地条目465和475,但本披露在此方面不受限制。在一些实施例中,可以通过创建本地条目465和将间接条目462修改成仅引用LID 1053-2048来反映图4D中的存储操作。类似地,可以通过创建本地条目475和将间接条目472修改成引用被截短的LID范围6163-7168来反映图4E中的操作。

往回参照图4A,引用模块434可以被配置成用于管理或“梳理”引用映射460。在一些实施例中,引用映射460中的每个条目包括元数据,该元数据包括引用计数。引用计数可以随着对引用条目的新的引用或链接的添加而增量,并且可以响应于移除对条目的引用而减量。在一些实施例中,可以针对引用映射460中的每个引用标识符保持引用计数。可替代地,可以针对整体引用条目来保持引用计数。当引用条目的引用计数达到0时,引用条目(和/或其一部分)可以从引用映射460中被移除。移除引用条目(或引用条目的一部分)可以包括如以上披露的使存储介质140上的相应数据失效(指示该数据不再需要被保留)。

在另一个实施例中,引用模块434可以使用“标记并清除”方法来移除引用条目。引用模块434(或其他进程,如转换模块134)可以通过尤其从前向映射160中的间接条目(或其他类型的条目)跟随引用条目的链接来定期检查对引用映射460中的条目的引用。如以上所披露的,可以移除在标记并清除过程中没有被访问的引用条目。标记并清除可以作为后台进程来操作,并且可以定期执行标记并清除操作以标识并移除不再使用的引用条目。

在一些实施例中,本文中披露的引用映射460可以根据需求来创建(例如,响应于克隆品的创建、或其他间接数据引用)。在其他实施例中,所有数据存储操作可以通过中间映射来执行。在这种实施例中,存储客户端106可以分配虚拟地址空间(VAS)中的间接虚拟标识符(VID),这些标识符可以通过中间映射层(如逻辑地址空间132)与存储地址相链接或引用存储地址。VAS可以在存储客户端106与存储介质140之间添加中间映射层。存储客户端106可以使用虚拟化地址空间的映射到逻辑地址空间132中的逻辑标识符上并且进而与对应的存储装置141和/或存储介质140上的存储地址相关联的VID来引用数据。如本文中所使用的,VAS可以包括但不限于逻辑单元号(LUN)地址空间、虚拟LUN(vLUN)地址空间等等。

图5A描绘了聚合层530的一个实施例,该聚合层被配置成用于使用虚拟化地址空间532尤其实现高效的范围克隆操作。聚合层530可以被配置成用于通过接口531向存储客户端106呈现VAS 532。与本文中披露的接口131相同,接口531可以包括块装置接口、虚拟存储接口、高速缓存接口等等。存储客户端106可以通过经过接口531引用VAS 532的VID来执行与聚合层530管理的存储资源有关的存储操作。

聚合层530可以进一步包括VAS转换模块534,该VAS转换模块被配置成用于通过一个或多个中间存储层(例如,存储层130)来将VID映射到存储资源上。相应地,聚合层530的VAS元数据535可以包括VAS前向映射560,该VAS前向映射包括VAS 532的VID与VAS 532的LID之间的任意到任意映射。尽管图5A中没有描绘,但VAS转换模块534和/或VAS前向映射560可以被配置成用于将多个不同的存储层130的多个逻辑地址空间132聚合成单个VAS 532。相应地,在一些实施例中,VAS 532可以与多个不同的逻辑地址空间132相对应,每个逻辑地址空间包括单独LID集合,并且每个逻辑地址空间与对应的存储层130、存储装置141、和/或存储介质140相对应。

尽管图5A与存储层130分开描绘了聚合层530,但本披露在此方面不受限制。在某些实施例中,聚合层530的VAS 532、VAS前向映射560、VAS转换模块534、和/或其他模块可以被实现为存储层130的一部分。

聚合层530可以被配置成用于利用VAS 532提供的中间虚拟地址空间以尤其实现高效的范围克隆、移动、合并和/或其他高级操作。可替代地或此外,可以利用中间映射层以便能够在随机存取、原地写入存储装置(如硬盘等等)上进行高效的克隆操作。

存储客户端106可以引用VAS 532的VID来执行存储操作。相应地,存储操作可以包括两个(或更多个)转换层。VAS前向映射560可以包括位于VAS 532的VID与存储层130的逻辑地址空间132的标识符之间的第一转换层。存储层130的前向映射160可以在LID与存储介质140上的存储地址之间实现第二转换层。

聚合层530可以被配置成用于通过使用尤其VAS元数据535、VAS前向映射560、和/或VAS转换模块534来管理在VAS 532内的分配。在一些实施例中,在VAS 532中分配VID可以包括将一个或多个相应的LID分配在逻辑地址空间132中(和/或一个或多个其他存储层的标识符)。相应地,分配在VAS 532中的每个VID可以与逻辑地址空间132中的一个或多个LID相对应。如本文中所披露的,聚合层530的VID与逻辑地址空间132之间的任意到任意映射可以是稀疏的和/或任意到任意。而且,在一些实施例中,聚合层530可以被配置成用于保持VID与多个不同的逻辑地址空间132之间的任意到任意和/或范围受管理的映射。相应地,聚合层530可以将由不同的对应存储层130管理的多个不同的存储装置141的逻辑地址空间聚合和/或组合成单个聚合VAS 532。

在图5A的实施例中,逻辑地址空间132不可以直接被访问,并且如此,存储客户端106可以通过接口531使用VID来引用存储资源。因此,引用一个或多个VID通过聚合层530来执行存储操作可以包括:a)标识与VID相对应的存储层130,b)通过使用VAS转换模块534和/或VAS前向映射560来确定存储层130的被映射到VID的LID;并且c)引用所确定的LID使用存储层130来实现存储操作。

图5B描绘了通过使用聚合层530来实现的克隆操作的一个实施例。如以上所披露的,VAS前向映射560可以与通过存储层130的逻辑地址空间132而间接映射到存储地址上的VAS 532相对应。图5B展示了用于通过聚合层530实现存储操作的寻址层。VAS 532的VID可以包括存储客户端106通过尤其聚合层530的接口531可访问的顶级寻址层。存储层130的逻辑地址空间132可以包括中间寻址层。VAS前向映射560可以包括VID与LID之间的任意到任意映射。通过使用前向映射160,LID可以被映射到存储地址空间144内的存储地址上。相应地,VID可以通过存储层130的中间逻辑地址空间被映射到存储地址空间144上。

如图5B中所展示的,在状态563A,VAS前向映射560可以包括表示VAS 532中的两个VID(10和11)的条目10,2。VAS前向映射560使VID条目10,2与逻辑地址空间132中的LID相关联。在图5B的实施例中,VAS前向映射560将VID条目10,2绑定到LID 100000和100001(条目100000,2)上条目10,2可以被分配给具体的存储客户端106,该存储客户端可以引用VID来执行存储操作。在状态563A下,存储层130可以被配置成用于将条目100000,2映射到存储介质140上的一个或多个存储地址(存储地址20000)上。

在状态536B下,存储层530可以实现用于克隆VID条目10,2的克隆操作。该克隆操作可以包括:a)分配新的VID条目400,2和b)使新的VID条目400,2与VAS前向映射560中的相应条目100000,2相关联。前向映射160中的相应条目100000,2可以保持不变。可替代地,前向映射160中的条目100000,2的引用计数(或其他指示符)可以被更新成指示该条目正在被多个VID范围引用。存储在存储地址20000的数据的上下文格式可以不变(例如,继续使数据与逻辑接口100000,2相关联)。该克隆操作可以进一步包括将持久性注释366存储在存储介质140上以指示VID条目400,2与前向映射160中的条目100000,2之间的关联。可替代地或此外,通过使VAS前向映射560(和/或其多个部分)持久化,可以使得该克隆操作持久和/或防崩溃。

在状态536C下,位于存储地址20000的数据可以被重新安置到存储地址40000。该重新安置可以在标准存储介质维护操作中进行,并且不更新克隆数据的上下文格式。重新安置数据可以包括更新前向映射160中的单个条目。VAS前向映射560可以保持不变。可以通过中间逻辑地址空间来管理对VID范围10,2和400,2的不同版本的修改。对VID 10的修改可以包括:a)在逻辑地址空间132中分配新的LID,b)联合新的LID存储经修改的数据,并且c)将新的LID映射到VAS前向映射560中的VID 10上。

用于实现本文中所披露的范围克隆、移动和/或合并操作的实施例可以用于高效地实现其他、更高级的存储操作,如快照、去重复、原子操作、事务、文件系统管理功能性等等。往回参照图4A,存储层130可以包括被配置成用于标识存储介质140上的重复数据的去重复模块374。可以使用任何合适的机构标识重复数据。在一些实施例中,重复数据通过以下内容来标识:a)扫描存储介质140的内容,b)生成不同数据段的签名值,并且c)将数据签名值进行比较以标识重复数据。这些签名值可以包括但不限于加密签名、散列码、循环码等等。签名信息可以存储在存储元数据135内,如前向映射160(例如,在与条目相关联的元数据内),和/或可以保持在存储元数据135的一个或多个单独数据结构中和/或在其中被标引。去重复模块374可以将数据签名进行比较,并且当检测到签名匹配时,可以执行一个或多个去重复操作。去重复操作可以包括验证签名匹配(例如,执行逐字节数据比较)和执行一个或多个范围克隆操作来通过两个或更多个LID范围来引用重复数据。

图6描绘了去重复操作的一个实施例。前向映射160可以包括可以引用存储在不同的对应存储地址3453-4477和7024-8048的重复数据的条目662和672。条目662和672可以与分别与LID 1024-2048和6144-6656相对应的不同的对应逻辑接口663和673相对应。重复数据段(数据段612)可以由如以上所披露的去重复模块374标识和/或验证。可替代地,重复数据可以被标识为数据被接收以供存储在存储层130。相应地,可以在数据的附加副本存储在存储介质140上之前对数据进行去重复。

响应于标识和/或验证出条目662和672引用重复数据,存储层130可以被配置成用于对数据进行去重复,这可以包括创建一个或多个范围克隆品来通过两个不同的LID集合引用重复数据的单个副本。如以上所披露的,创建范围克隆品可以包括修改数据段的逻辑接口663和673。在图6的实施例中,重复数据作为数据段612分别存储在位于存储位置3453-4477和7024-8048的包610内。克隆操作可以包括修改数据段之一的逻辑接口(或数据段的新版本和/或副本),这样使得这两个条目663和673都可以引用该数据段。

范围克隆操作可以使用本文中披露的克隆实施例中的任何克隆实施例来实现,包括图3A-E中的范围克隆实施例、图4A-E中的引用条目实施例、和/或图5A-B的中间映射实施例。在图6的去重复实施例中,这两个LID范围1024-2048和6144-7168可以被修改成通过引用条目682引用数据段612的单个版本(可以使其他数据段失效)。如此,去重复操作可以包括创建引用条目682来表示去重复数据段612(引用包610)。去重复操作可以进一步包括将条目662和672修改和/或转换成对应的间接条目665和675,如以上所披露的,这些条目可以通过引用条目682映射到数据段612上。去重复操作可以进一步包括将数据段612的逻辑接口669修改成使数据段612与这两个LID集合1024-2048和6144-7168(以及引用条目682)相关联。如以上所披露的,去重复操作可以进一步包括将持久性注释366存储在存储介质140上。

如以上所披露的,去重复操作可以进一步包括将数据段612的上下文格式更新成与经修改的逻辑接口669相一致。更新上下文格式可以包括在一个或多个后台操作中以更新后的上下文格式(数据包610)将数据段612附加到存储日志中(例如,附加在存储位置84432-85456)。更新后的数据包610可以包括使数据段612与更新后的逻辑接口669(例如,通过引用标识符0Z-1023Z与LID 1024-2048和6144-6656)相关联的持久性元数据614。

尽管图6展示了克隆和/或去重复单个条目或LID范围,但本披露在此方面不受限制。在一些实施例中,多个前向标识符范围可以在单个克隆操作中被克隆。这种类型的克隆操作可以用于创建地址范围(或整个逻辑地址空间132)的“快照”。如本文中所使用的,快照是指存储装置(或LID集合)在具体时间点的状态。快照可以保持LID范围的“初始”状态,而不管在完成快照操作之后该范围内发生的变化。

图7是描绘了包括存储层130的系统700的一个实施例的框图,该存储层被配置成用于高效地实现快照操作。图7的实施例与逻辑地址空间132内的地址范围有关。然而,本披露在此方面不受限制,并且可以被适配成与其他类型的地址范围一起使用,如像以上所披露的VAS 532内的范围和/或长度。存储层130可以包括被配置成用于实现本文中所披露的快照操作的快照模块736和定时模块738。

在状态773A下,存储层130可以被配置成用于创建LID范围FR1的快照。创建快照可以包括保存LID范围FR1在具体时间的状态。快照操作可以进一步包括保存LID范围FR1同时允许后续存储操作在LID范围内被执行。

如以上所披露的,存储层130可以被配置成用于通过使用尤其日志存储模块136来将数据存储在存储介质140上的存储日志中。存储操作的日志顺序可以使用与数据包相关联的序列信息来确定,如存储分区170A-N上的序列指示符113和/或存储介质140的存储地址空间144内的顺序存储位置(如结合图1D和图1E披露的)。

存储层130可以被进一步配置成用于保持其他类型的排序和/或定时信息,如日志中的数据的相对时间排序。然而,在一些实施例中,由于尤其数据在介质管理操作中被重新安置在存储装置内,数据的日志顺序可能对定时信息反映得不准确。重定安置数据可以包括从存储介质140上的数据初始存储位置读出数据并且将该数据附加在存储日志内的当前附加点处。如此,较旧的、重新安置的数据可以与较新的当前数据一起存储在存储日志中。因此,尽管存储日志可以保存与具体LID有关的数据操作的相对日志顺序,但存储日志可能对绝对定时信息反映得不准确。

在一些实施例中,日志存储模块136被配置成用于使数据与定时信息相关联,这可以用于建立在存储介质140上执行的存储操作的相对定时信息。在一些实施例中,定时信息可以包括对应的时间戳(由定时模块738保持),这些时间戳可以应用于存储在存储介质140上的每个数据包。时间戳可以存储在数据包310的持久性元数据314内。可替代地或此外,定时模块738可以被配置成用于在较粗粒度级追踪定时信息。在一些实施例中,定时模块738保持一个或多个全局定时指示符(时刻指示符)。如本文中所使用的,“时刻指示符”是指用于确定通过存储层130执行的存储操作的相对定时的标识符。日志存储模块136可以被配置成包括数据包710中的时刻指示符739。时刻指示符739可以与定时模块738保持的当前时刻(例如,全局定时指示符)相对应。时刻指示符739可以与相应的数据段712被写入存储日志的时刻相对应。时刻指示符739可以存储在包710的持久性元数据714内,并且如此,可以在重新安置操作过程中保持与数据包710相关联。定时模块738可以被配置成用于响应于某些事件而使全局时刻标识符增量,如创建新快照、用户请求等等。数据段712的时刻指示符739可以贯穿重新安置和/或其他介质维护操作保持不变。相应地,时刻指示符739可以与数据段712的初始存储时间相对应,与存储日志中的数据包710的相对位置无关。

快照操作可以包括保存具体LID范围(FR1)在具体时间的状态。因此,快照操作可以包括将与FR1有关的数据保存在存储介质140上。保存该数据可以包括:a)标识与具体时间帧(时刻)有关的数据和b)将所标识的数据保存在存储介质140上(例如,尤其在存储恢复操作中,防止所标识的数据从存储介质140中被移除)。尽管通过后续存储操作(例如,覆写、修改、裁剪和/或以其他方式消除数据的操作)而失效,但与快照有关的数据可以被保留。需要针对具体快照被保存的数据可以通过使用以上披露的时刻指示符739来标识。

在状态773A下(时间t1,用时刻指示符e0表示),存储层130可以接收实现快照操作的请求。响应于该请求,快照模块736可以确定定时模块738保持的时刻标识符的当前值。时刻标识符的当前值可以被称为当前“快照时刻”。在图7的实施例中,快照时刻是0。快照模块736可以进一步被配置成用于引起定时模块738使当前全局时刻标识符增量(例如,使时刻标识符增量到1)。创建快照可以进一步包括将被配置成用于指示当前、更新后的时刻标识符的持久性注释366存储在存储介质上。持久性注释366可以被进一步配置成用于指示与快照时刻有关的数据有待被保存(例如,标识有待在快照操作中保存的具体LID范围FR1)。持久性注释366可以在元数据重构操作过程中用于:a)确定当前快照时刻和/或b)将快照模块736和/或介质管理模块370配置成保存与具体快照时刻(例如,时刻e0)相关联的数据。

快照模块736可以被进一步配置成用于指令介质管理模块370保存与快照时刻相关联的数据。作为响应,介质管理模块370可以被配置成用于:a)标识为快照待保存的数据(快照数据),和b)在尤其存储恢复操作中防止所标识的数据从存储介质140中被移除。介质管理模块370可以通过使用数据包710的时刻指示符739来标识快照数据。如结合图1E所披露的,数据可以不在原地被写入在存储介质140上。可以基于日志内的相应数据包710的顺序来确定与具体LID相关联的最新版数据。介质管理模块370可以被配置成用于将快照时刻内的最新版数据标识为需要被保存的数据。可以移除在快照时刻上与其他数据相比显得过时的数据。参照图1E的实施例,如果数据X0和X1(与同一LID A相关联)两者均用快照时刻0标记,则介质管理模块370将会将在时刻0的最新版数据标识为X1,并且标记数据X0以便移除。然而,如果数据X0标记有快照时刻0而数据X1标记有更晚的时刻(例如,时刻1,在快照操作之后),则介质管理模块370可以将数据X0保存在存储介质140上以便保存快照的数据。

在状态773B下,快照模块736可以被配置成用于保存与快照FR1有关的数据(与时刻e0相关联的数据),同时允许在后续时刻(例如,时刻e1)期间继续执行存储操作。保存FR1可以包括克隆FR1以保存LID范围在时刻e0的初始状态(FR1(e0)),同时允许参照FR1继续进行存储操作。可以使用复制的条目、引用条目和/或中间映射层中的一个或多个按以上披露的那样实现克隆操作。存储操作可以包括引用LID FR1来将数据附加到存储介质140上的存储日志上。与快照FR1(e0)相对应的克隆LID可以不变。相应地,尽管LID范围变化,但可以保存快照FR1(e0)。在状态773B存储的数据可以与当前时刻(e1)的时刻指示符739一起存储。快照模块736可以被配置成用于保存变得过时和/或通过在时刻e1(和后续时刻)期间执行的存储操作而失效的数据。往回参照图1E的实施例,介质管理模块370可以将数据X0标识为针对快照FR1待保存的数据(数据X1可能在快照操作执行之后已经被存储)。快照模块736和/或介质管理模块370可以被配置成用于保存数据X0,即使在时刻e1的数据X1随后使该数据过时。即使LID A被删除、裁剪等等,也可以保留数据X0。

快照FR1(e0)(包括LID范围FR1(e0)和标记有时刻指示符e0的数据)可以被保存,直至相应的快照被删除。响应于通过接口131接收的请求,可以删除快照。如在状态773C指示的,甚至在已经创建和/或删除其他介于中间的时刻(时刻e1-eN)之后,时刻0可以保留在存储介质140上。删除时刻e0可以包括将快照模块736和/或介质管理模块370配置成移除与时刻e0相关联的无效/过时数据。

在于状态733A创建快照之后执行的存储操作可以修改逻辑地址空间132和特别是前向映射160。这些修改可以包括响应于将数据附加到存储介质140、将LID添加到FR1和/或将其移除等等而更新存储地址绑定。在一些实施例中,快照模块736被配置成用于将快照范围FR1(e0)保存在单独存储元数据135内,如逻辑地址空间132的分开区域,保存在单独命名空间中,保存在分开映射中等等。可替代地,快照模块736可以允许在前向映射160中进行改变而不保存在时间e0的初始版FR1。快照模块736可以被配置成用于使用保存在存储介质140上的快照数据重构e0(时间t1)的前向映射160。如以上所披露的,可以重构在时间t1的前向映射160,这可以包括按顺序访问存储在存储介质140上(按日志顺序)的数据和基于和数据包710相关联的持久性元数据714来创建前向映射条目。在图7的实施例中,可以通过引用标记有时刻指示符739e0(或更低)的数据包710来重构与时刻e0相对应的前向映射160。与大于e0的时刻指示符739相关联的数据可以被忽略(由于这种数据与快照FR1(e0)的创建被创建之后的操作相对应)。

本文中披露的存储层130可以被进一步配置成用于实现高效的范围移动操作。图8A描绘了本文中披露的存储层130实现的移动操作的一个实施例。前向映射160包括被配置成用于将LID 1023-1025绑定到存储介质140上的对应数据段的条目862。分开描绘条目862以更好地展示该实施例的细节;然而,条目862可以包括在包括整个LID 1023-1025范围的单个条目中。条目862可以定义存储在存储地址32、3096和872的数据的逻辑接口863。如以上所披露的,可以用使数据与相应LID 1023、1024和1025相关联的上下文格式存储存储在存储地址32、3096和872的数据。

存储层130可以被配置成用于通过尤其用与新的LID集合(例如,9215,9216和9217)相对应的新逻辑接口863B替换LID 1023、1024和1025与位于对应的介质存储位置32、3096和872的数据之间的关联来将条目862移动到LID 9215-9217。可以响应于经由接口131接收的请求和/或作为更高级存储操作的一部分(例如,重命名文件的请求、平衡和/或重组前向映射160的操作等等)来执行移动操作。

移动操作可以根据以上披露的克隆实施例中的一个或多个实施例来实现。在一些实施例中,移动操作可以包括使映射到LID 1023、1024和1025上的存储地址与目的LID 9215、9216和9217相关联,这可以引起根据移动操作修改数据的逻辑接口863A。移动操作可以进一步包括将持久性注释366存储在存储介质140上以便确保移动操作持久并且防崩溃。如以上披露的,可以一个或多个后台操作中根据更新后的逻辑接口863B重新写入存储在存储地址32、872和3096的数据。

图8B描绘了移动操作的另一个实施例。如以上所描述的,移动操作可以包括移动与LID 1023-1025至LID 9215-9217相关联的数据。图8B中的移动操作可以利用结合图4A-E披露的引用条目。相应地,移动操作可以包括在引用映射460中创建引用条目882以表示移动操作。该移动操作可以进一步包括分配新的间接条目866来通过引用条目882引用数据。引用条目882可以包括预先移动可以与地址32、3096和872相关联的LID 1023、1024和1025。因此,数据的新逻辑接口863C可以包括间接条目886和相应的引用条目882。如以上所披露的,该移动操作可以进一步包括将持久性注释366存储在存储介质上以便确保该移动操作持久并且防崩溃。

存储在存储地址32、3096和872的数据的上下文格式可以与更新后的逻辑接口863C不一致;数据的上下文格式可以使对应的数据段与LID 1023、1024和1025相关联,与9215、9216和9217相反(和/或引用条目)。持久性注释366可以包括数据的更新后的逻辑接口863C,从而使得存储元数据135(例如,前向映射160和/或引用映射460)可以被正确地重构(如果必要的话)。

存储层130可以提供通过经修改的逻辑接口863C(LID 9215、9216和9217)访问不一致上下文格式的数据。在移动操作之后(在移动操作和/或其他存储操作的路径之外),可以用与经修改的逻辑接口863C一致的上下文格式重新写入和/或重新安置数据。在一些实施例中,如以上所描述的,在一个或多个后台操作中,介质管理模块370可以重新写入位于存储地址32、3096和872的数据。因此,该移动操作可以响应于更新前向映射160和/或存储持久性注释366而完成(和/或返回确认)。

如图8C中所展示的,可以响应于重新写入移动操作的数据而更新前向映射160和/或其他存储元数据135。在图8C的实施例中,可以在存储恢复操作中重新安置存储在介质存储位置32的数据段812A,这可以包括以与经修改的逻辑接口863C一致的上下文格式(数据包810A)存储数据。数据包810A可以包括使数据段812A与LID 9215相关联的持久性元数据814A。前向映射160可以被更新成引用更新后的上下文格式的数据,这可以包括将LID 9215的间接条目修改成直接引用数据包810A而不是引用条目。与LID9215相对应的条目可以从间接条目还原到标准、本地条目,并且LID 1023的引用条目可以从引用映射460中被移除。

参照图8D,存储客户端106可以修改与LID 9217相关联的数据,这可以包括不在原地存储数据段(例如,在存储地址772)。可以用与经修改的逻辑接口863C(例如,使数据与LID 9217相关联)一致的上下文格式写入数据段。如以上所披露的,作为响应,前向映射160可以被更新成使LID 9217的条目与数据段的存储地址(例如,存储地址772)相关联并且从引用映射460中移除LID 1025的引用条目。

在一些实施例中,引用映射460可以与前向映射160分开保持,这样使得其中的条目(例如,条目882)不能被存储客户端106直接引用。这种分隔可以允许存储客户端106更高效地操作。例如,不是直至以更新后的上下文格式重新写入和/或重新安置数据才停止操作,可以在一个或多个后台进程中重新写入数据时继续进行数据操作。参见图8E,在以上披露的移动操作之后,存储客户端106可以将数据联合LID 1024一起存储。由于尤其位于存储地址3096的数据还没有以更新后的上下文格式被重新写入,与LID 1024相对应的引用条目882可以包括在引用映射460中。然而,引用映射460可以与前向映射160分开保持,不会发生名称冲突,并且存储操作可以完成。前向映射160可以包括单独条目864,该条目包括存储在介质存储位置4322的数据的逻辑接口,同时继续提供通过逻辑接口863C(和引用映射460)对之前绑定至LID 1024上的数据的访问。

在所披露的移动操作中,当由于尤其重新写入、重新安置、修改、删除和/或覆写相应的数据,间接条目不再与引用映射460中的引用条目相链接时,可以移除引用条目,并且这些间接条目可以还原至直接本地条目。此外,如以上所披露的,与移动操作相关联的持久性注释366可能失效和/或从存储介质140中被移除。

往回参照图1A,存储层130的接口131可以被配置成用于提供API和/或接口用于执行本文中所披露的存储操作。可以通过块接口、扩展存储接口等等中的一项或多项来公开这些API和/或接口。块接口可以通过使用接口扩展(如fadvise参数、I/O控制参数等等)被扩展成包括附加API和/或功能性。接口131可以提供API来执行本文中所披露的范围克隆操作、范围移动操作、范围合并操作、去重复、快照、和其他更高级的操作。接口131可以允许存储客户端106将属性和/或元数据应用于LID范围(例如,冻结范围)、管理范围快照等等。如本文中所披露的,范围克隆操作包括创建具有一个或多个源LID的集合的逻辑副本。范围克隆、移动、和/或合并操作可以使用本文中披露的实施例中的任何克隆实施例来实现,包括但不限于图3A-E中的范围克隆实施例,图4A-E中的引用条目实施例、和/或图5A-B的中间映射层实施例。

本文中披露的范围克隆、移动、和/或合并操作可以用于实现更高级的操作,如去重复、快照、高效文件拷贝操作(逻辑文件副本)、文件一致性管理、地址空间管理、mmap检查点、原子写入等等。还可以通过存储层130的接口131公开这些较高级的操作。各个不同的存储客户端106(如操作系统、文件系统、数据库服务等等)可以利用所披露的操作。

图9A描绘了包括存储层130的系统900A的一个实施例,该存储层被配置成用于实现文件管理操作。系统900A可以包括文件系统906,该文件系统可以被配置成用于利用存储层130的功能性以减低复杂度、开销等等。文件系统906可以被配置成用于利用本文中所披露的范围克隆、移动、快照、去重复、和/或其他功能性以实现高效的文件级快照和/或拷贝操作。文件系统906可以被配置成用于响应于客户端请求(例如,拷贝命令、文件快照ioctrl等等)而实现这种操作。文件系统906可以被配置成用于通过尤其以下内容在源文件上实现高效的文件拷贝和/或文件级快照操作:a)清除源文件中的脏页(如果有的话),b)创建新的目的文件来表示拷贝的文件和/或文件级快照,和c)指令存储模块130执行被配置成用于将源文件克隆到目的文件上的范围克隆操作。

图9A描绘了用于实现文件系统906的范围克隆操作的各实施例。在一些实施例中,并且如在状态911A所描绘的,存储层130可以被配置成用于保持逻辑地址空间132,在该逻辑地址空间中,源文件的LID(有待克隆的文件)通过使用前向映射160被映射到存储介质上的文件数据上。在状态911B描绘的相应范围克隆操作可以包括:a)为目的文件分配LID集合,和b)将源文件和目的文件的LID映射到存储介质140上的文件数据上。范围克隆操作可以进一步包括将持久性注释366存储在存储介质140上以指示文件数据与源文件和目的文件LID两者相关联。如本文中所披露的,范围克隆操作可以进一步包括根据更新后的上下文格式重新写入文件数据。

在其他实施例中,存储层130可以利用引用映射460以实现范围克隆操作(例如,像图4A-E所披露的)。在范围克隆操作之前,在状态911C,源文件的LID可以直接被映射到前向映射160中的相应文件数据上。在状态911D创建范围克隆品可以包括使引用映射460中的一个或多个引用条目与文件数据相关联,并且使与源文件LID和目的文件LID相对应的间接条目与引用条目相链接。如本文中所披露的,范围克隆操作可以进一步包括将持久性注释366存储在存储介质140上和/或更新文件数据的上下文格式。

在一些实施例中,存储层130可以被配置成用于使用中间层映射层(例如,像图5A-B中所披露的)来实现范围克隆操作。如在状态911E指示的,源文件可以与VAS 532的VID集合相对应,其可以通过中间地址空间(例如,存储层130的逻辑地址空间132)被映射到存储介质140上的文件数据上。执行范围克隆操作可以包括:a)将VID分配在目的文件的VAS 532中,和b)使目的文件的VIS与中间映射层的LID相关联(例如,同一LID集合映射到源文件VID)。范围克隆操作可以进一步包括将持久性注释366存储在存储介质140上,指示目的VID与文件数据LID相关联。由于文件数据已经绑定到中间标识符,文件数据的上下文格式不需要被更新。

文件系统906可以进一步被配置成用于利用存储层130以抽点检查mmap操作。如本文中所使用的,“mmap”操作是指其中文件内容按存储器页通过标准加载和存储操作而不是文件系统906的标准读出/写入接口被访问的操作。“msync”操作是指将文件的脏页(如果有的话)清除到存储介质140的操作。mmap操作的使用使文件抽点检查困难。在存储器中执行文件操作并且当必须保存状态时发出msync。然而,msync之后的文件状态表示当前存储器中状态,并且上一个保存的状态可能丢失。因此,如果文件系统906在msync过程中崩溃,则文件可能留在不一致状态下。

在一些实施例中,文件系统906被配置成用于在使用msync调用过程中抽点检查mmap文件的状态。如以上所披露的,抽点检查文件可以包括创建文件级快照(和/或范围克隆)。文件级快照可以被配置成用于在应用变化之前保存文件的状态。当发出msync时,可以创建另一个克隆品以反映在msync操作中应用的变化。如图9B中所描绘的,在状态913A(在mmap操作之前)文件1可以与LID 10-13和存储介质140上的相应存储地址P1-P4相关联。响应于mmap操作,文件系统906可以通过存储层130的接口131执行范围克隆操作,其可以包括创建文件1的克隆品(用文件1.1表示)。文件1.1可以与不同的LID 40-43的集合相关联,该集合引用相同文件数据(例如,相同存储地址P1-P4)。在其他实施例中,如以上所披露的,可以使用引用映射460和/或中间转换层来克隆文件1。

响应于msync调用,文件系统906可以执行另一个范围克隆操作(通过使用存储层130)。如在状态913C所展示的,与msync操作相关联的范围克隆操作可以包括用一个或多个脏页中的内容(存储地址P5和P6)更新文件1并且克隆更新文件1作为文件1.2。文件1.1可以反映文件在msync操作之前的状态。相应地,如果失败,则文件系统906可以能够重构文件1的之前的状态。

如以上披露的,存储层130可以被配置成用于实现范围克隆和范围合并操作,这些操作可以被利用以实现更高级的操作,如文件一致性(例如,像本文中进一步详细披露的关闭至打开文件一致性)、原子操作等等。这些操作可以包括:a)克隆逻辑地址空间132的具体区域,b)在克隆区域内执行存储操作,和c)选择性地将克隆区域合并和/或折叠到逻辑地址空间132的另一个部分中。如本文中所使用的,合并和/或折叠逻辑地址空间132的区域是指通过尤其将在这些范围之一中实现的变化结合到一个或多个其他范围中来组合两个或更多个LID范围。可以根据合并策略实现合并操作,该合并策略可以被配置成用于解决不同LID范围之间的冲突。合并策略可以包括但不限于“覆写”模式,在该模式下,用一个LID范围中的内容覆写另一个LID范围中的内容;“或”模式,在该模式下,LID范围中的内容被组合在一起(例如,在逻辑或操作中);冲突时拷贝模式,在该模式下,通过创建一个或多个LID的单独独立副本来解决冲突;等等。在覆写模式下,基于任何合适的判据,包括但不限于提交时间(例如,较新的操作覆写更早的操作)、优先级等等,可以确定覆写一个或多个其他LID范围中的内容的LID范围。

图9C描绘了通过使用存储层130来实现范围合并操作的实施例。在图9C的实施例中,存储层130可以被配置成用于克隆标识符范围914,该标识符范围可以由前向映射160内的一个或多个条目来表示。范围914内的LID072-083可以绑定到存储地址95-106上。本文中披露的范围克隆和/或合并操作可以使用图3A-E中的范围克隆和/或移动实施例、图4A-E中的引用条目实施例、和/或图5A-B的中间映射层实施例来实现。相应地,在一些实施例中,LID 072-083可以通过一个或多个引用条目和/或中间映射层绑定到存储地址95-106上。

存储层130可以被配置成用于克隆范围914,如在状态941A所展示的,其可以包括将新的LID范围924绑定到存储地址95-106上。范围914和/或924可以包括对应的元数据984和/或994,该元数据被配置成用于指示范围914和924相关(例如,绑定到同一存储地址集合上)。元数据984和/或994可以被配置成用于使LID 072-083与972-983相链接,这样使得与LID范围之一有关的修改可以与其他范围中的LID相关(例如,联合LID 972被写入的数据可以与相应的LID 072相关联等等)。元数据984和/或994可以指示克隆LID范围的同步策略,如以上所披露的,该同步策略可以指示克隆品之间的分配操作是否应被同步。元数据984和/或994可以进一步包括和/或引用合并策略,该合并策略可以指定如何管理合并冲突。该合并策略可以通过存储层130的接口131来指定,可以基于全局和/或默认合并策略来确定,可以通过请求参数来指定(例如,fadvise、ioctrl,等)等等。如以上所披露的,克隆操作可以进一步包括将持久性注释366附加到存储介质140上,该持久性注释被配置成用于使位于存储地址95-106的数据与LID范围972-983相关联(和/或以更新后的上下文格式重新写入数据)。

存储层130可以响应于来自一个或多个存储客户端106的存储请求而在范围914和/或924中的一项或多项内执行存储操作。如在状态941B所展示的,存储操作可以修改与LID 972-973相关联的数据,这可以包括使标识符972-973与新的存储地址721-722的集合相关联。在状态941B的存储操作之后,存储层130可以执行范围合并操作来使LID范围972-983与范围072-083合并。范围合并操作可以包括根据合并策略将参照LID范围924做出的修改结合到LID范围914中。合并策略可以指定对克隆范围924所做的修改覆写源范围914内的数据。相应地,在状态941C展示的合并操作的结果可以包括将源范围914中的LID 072-073绑定到位于存储地址721-722的经修改的数据上。如以上所披露的,范围合并操作可以进一步包括解除分配所克隆的LID范围972-983、存储被配置成用于使位于存储地址756-757的数据与LID072-073相关联的持久性注释366、和/或以更新后的上下文格式将数据重新写入在存储地址721-722。如以上所披露的,可以使存储在存储地址95-96的已经被位于721-722的新数据消除的数据失效。

在范围914和/或924内执行的存储操作可能引起冲突。在一些实施例中,与LID范围相关联的合并策略可以预先制止冲突。如在本文中进一步详细披露的,在原子存储操作中,存储层130可以锁定一个或多个LID范围,同时可以在一个或多个LID范围中完成原子存储操作。然而,在其他实现方式中,存储层130可以允许在克隆范围内并发执行存储操作。在状态941D,存储层130可以实现被配置成用于覆写和/或修改与范围924中的LID 972-973和982-983相关联的数据的存储操作。存储层130可以实现被配置成用于覆写和/或修改与范围914中的LID 072-073相关联的数据的其他存储操作。与LID 072-073和972-973有关的存储操作可能在范围914和924之间产生合并冲突。如以上所披露的,可以根据合并策略解决合并冲突。在一些实施例中,合并策略可以包括基于尤其存储日志中的存储操作的相对顺序来应用最新修改。在其他实现方式中,合并策略可以基于请求对应的存储操作的存储客户端106(进程、应用等等)的相对优先级来解决冲突。在另一个实现方式中,合并策略可以通过创建范围914和/或924的两个(或更多个)版本表示不同的冲突版本来解决冲突。

状态941E描绘了合并操作的结果的一个实施例,该合并操作被配置成结合了与LID 072-073相关联的操作操作,代替与LID 972-973相关联的冲突修改。因此,在状态941E,LID 072-073被绑定到与参照LID 072-073执行的存储操作相对应的存储地址756-757上,而不是绑定到与参照LID972-973执行的存储操作相对应的存储地址721-722上。

状态941F描绘了合并操作的结果的一个实施例,该合并操作被配置成结合了范围972-973的修改,代替参照LID 072-073做出的冲突修改。相应地,在状态941F,标识符072-073被绑定到与参照LID 972-973执行的存储操作相对应的存储地址721-722上,而不是绑定到与LID 072-073相关联的存储地址756-757上。

状态941G描绘了合并操作的结果的一个实施例,该合并操作被配置成用于通过创建单独范围副本或版本来管理合并冲突。范围914可以结合参照标识符982-983做出的非冲突修改并且可以保留与标识符072-073有关的冲突存储操作的结果(而不是结合存储地址721-722)。其他LID范围924可以保留状态941D的修改而不结合参照标识符072-073做出的冲突存储操作的结果。尽管状态941G使用初始克隆LID范围072-083914和974-981924描绘了副本,但本披露在此方面不受限制并且可以被配置成用于在逻辑地址空间132的任何区域内创建多个范围副本和/或版本。如本文中所披露的,参照状态941E-G披露的范围合并操作可以进一步包括在一个或多个后台存储操作中将一个或多个持久性注释366附加到存储介质140上以使存储在存储地址721-722、756-757和/或767-768的数据与相应的LID相关联和/或重新写入数据。

在一些实施例中,在所克隆的LID范围914和/或924中的一项或多项内的操作可以包括通过尤其扩展范围914和/或924、收缩范围914和/或924等等来修改LID范围914和/或924。扩展范围914和/或924之一可以包括对另一个范围的相应扩展,并且如此,可以在将附加LID分配在两个范围914和924中时预测分配操作。

本文中披露的范围合并操作可以使用图3A-E中的范围克隆和/或移动实施例、图4A-E中的引用条目实施例、和/或图5A-B的中间映射层实施例来实现。图9D使用引用映射460描绘了范围合并操作的一个实施例。如在状态943A所描绘的,克隆该范围914可以包括将LID范围924分配在逻辑地址空间132中、使范围914和924相链接(使用尤其元数据984和/或994)、和使范围914和924与引用映射460中的引用标识符934相关联。如以上所披露的,该范围克隆操作可以进一步包括将持久性注释366存储在存储介质140上,该持久性注释被配置成用于使引用映射460中的范围934与间接范围914和/或924相关联。引用映射460内的范围934可以被绑定到存储地址95-106上。相应地,范围914和924两者均可以间接地引用位于相同存储地址的相同数据。

如在状态943B所描绘的,范围924内的被配置成用于修改与LID982-983相对应的数据的存储操作可以包括在范围924内分配新的LID并将新的本地条目982-983绑定到相应的存储地址767-768上。如以上所披露的,合并范围914和924可以包括根据合并策略将位于存储地址767-768的经修改的数据结合到范围914中。在图9D的实施例中,状态943C中的范围合并操作可以包括移除引用条目934并更新范围914中的LID 081-083以引用位于存储地址767-768的更新后的数据。如以上所披露的,该合并操作可以进一步包括存储持久性注释366和/或以更新后的上下文格式将数据重新写入在存储地址767-768。

图9E描绘了由存储层130实现的范围克隆和范围合并操作的进一步实施例。图9E展示了如结合图5A-B中披露的包括中间地址空间的实施例中的范围克隆和范围合并操作。在状态947A,包括VID 072-083的VID范围914通过VAS前向映射560中的中间标识符272Z-283Z间接绑定到存储地址95-106上。中间标识符可以是单独中间地址空间2136的一部分(例如,存储层130中的逻辑地址空间132)。

如在状态947B展示的,克隆VID范围914可以包括分配包括VID972-983的新VID范围924并使范围924与VAS前向映射560中的中间标识符272Z-283Z相关联。该克隆操作可以进一步包括将持久性注释366存储在存储介质140上,该持久性注释被配置成用于使VID范围924与中间地址272Z-283Z相关联。如本文中所披露的,存储操作可以参照VID范围914和/或924来执行。对VID范围914和/或924的修改可以在对应的VID范围914和/或924与中间地址空间2136之间的更新后的映射中得到反映。在状态947C,修改VID 982-983的数据的存储操作在VID 982-983与中间标识符984Z-985Z、和存储地址456-457之间的更新后的映射中得到反映。如在状态947D所展示的,合并VID范围914和924可以包括将范围914的VID映射更新成引用更新后的数据(通过中间地址984Z-985Z)。如以上所披露的,该合并操作可以进一步包括解决合并冲突(如果有的话)。该合并操作可以进一步包括将一个或多个持久性注释366附加到存储介质140上以使VID082-083与中间地址984Z-985Z相关联。

在一些实施例中,存储层130可以利用本文中所披露的范围克隆、移动、和/或合并操作以便为存储客户端106(如文件系统、数据库等等)提供文件一致性功能性。参照图9F,文件系统906可以利用存储层130在每个网络文件系统(NFS)版3和/或其他文件系统实现方式和/或协议实现关闭至打开文件一致性模型。关闭至打开文件一致性模型可以被配置成用于允许多个进程和/或应用(文件系统客户端)在同一文件上并发地操作。在文件关闭时提交文件修改;在文件上并行操作的其他客户端直到文件下一次打开时才看到变化。相应地,在文件打开时设定文件的状态,并且直到文件重新打开时才应用其他客户端并行实现的变化。

在一些实施例中,当在工作克隆范围内做出修改时,文件系统906可以利用存储层130来保存文件的“初始”数据(例如,文件的一致性版本)。如本文中所使用的,保存文件的“初始”数据和/或文件的一致性版本是指将文件数据保持在与文件被打开时的时间相对应的状态和/或保持文件修改日志,处于其初始未修改状态的文件数据的状态可以用该文件修改日志来重构。

图9F描绘了包括存储层130的系统900F的一个实施例,该存储层被配置成用于实现关闭至打开文件一致性模型。文件系统906(和/或其他存储客户端106)可以利用存储层130来高效地实现关闭至打开文件一致性。存储层130可以被配置成用于:a)响应于文件系统客户端926A-N的文件打开请求而克隆文件,从而产生文件的“原始”或“一致性”版本和文件的“工作”版本;b)参照文件的工作版本来执行存储操作;和c)响应于文件关闭而将文件的工作版本合并到文件的原始版本中。存储层130可以被配置成用于在本文中所披露的一个或多个范围克隆操作中克隆文件数据(例如,使用图3A-E、图4A-E、图5A-B中的范围克隆实施例等等)。存储层130可以进一步被配置成用于使用本文中所披露的一个或多个范围合并和/或折叠操作来合并文件的工作版本和文件的原始或一致性版本。文件的工作版本可以表示当文件被具体存储客户端926A-N打开时文件的状态。存储客户端926A-N可以独占地访问文件的工作版本,并且如此,文件的工作版本可以与其他客户端926A-N做出的文件修改隔离。存储层130可以被配置成用于参照文件的“原始”或“一致性”逻辑接口来保持初始、未修改的文件数据,这可以包括保持文件数据与一致性逻辑接口之间的关联,而存储操作可以参照文件的工作逻辑接口来执行。可以根据冲突解决策略或合并策略解决不同存储客户端926A-N所做的文件修改之间的冲突,如最后写入(例如,在时间上最后写入覆写之前的写入);冲突时拷贝(例如,创建文件的单独版本);基于客户端926A-N、应用、进程等等的优先级;等等。

在图9F的实施例中,在状态953A,转换模块134包括存储介质140上的位于存储地址P0-P3的文件的LID(文件LID 950A)与文件952A的数据之间的映射951A。可以使用本文中披露的前向映射160和/或结合图5A-B披露的一个或多个中间映射层来实现映射951A。

在状态953B,存储层130可以被配置成用于响应于存储客户端(存储客户端926B)的文件打开请求而克隆文件。可以通过接口131接收请求,作为显式请求、请求参数(例如,fadvise、ioctrl等)等等。克隆操作可以包括一个或多个范围克隆操作,如本文中所披露的,该一个或多个范围克隆操作可以包括分配与工作版文件相对应的“克隆”文件LID 950B的新集合并且使该“克隆”标识符950B的集合与同一文件数据952A相关联,作为文件的原始版本的LID 950A(初始或一致性逻辑标识符950A的集合)。如以上所披露的,范围克隆操作可以进一步包括将持久性注释366存储在存储介质140上以使文件数据952A与原始文件LID 950A和文件LID 950B的工作版本两者相关联。

在一些实施例中,存储层130和/或文件系统906可以被配置成用于将存储客户端926B执行的文件操作定向至文件的工作版本(LID 950的工作集合)。相应地,可以参照克隆文件LID 950B做出存储客户端926B所做的修改。这种修改可能不影响文件LID 950A的初始、原始版本的状态。因此,存储客户端926B可以参照LID 950B修改文件的工作版本而不改变文件的初始、原始版本的LID 950A。

在状态953C,存储客户端926B已经执行了存储操作(通过存储层130)来修改存储在存储地址P3的文件中的数据;经修改的数据可以附加到位于存储地址P64的存储日志上。作为响应,转换模块134可以将映射951B更新成将文件950B的所克隆的工作版本的LID绑定到位于存储地址P64的经修改的文件数据952B上。存储客户端926B未修改的其他LID可以继续绑定到初始、未修改的文件数据952A上。存储层130被配置成用于保存文件的原始版本的标识符950A与位于存储地址P0-3的未修改的文件数据952A之间的初始映射951A。

在存储客户端926B关闭文件之前,另一个存储客户端926N可以发出打开该文件的请求。作为响应,并且如在状态953D所描绘的,存储层130可以创建原始文件的另一个克隆品(克隆原始文件标识符950A)。克隆LID(FID950C)可以与没有被存储客户端926B参照克隆标识符范围950B做出修改的初始文件状态相对应。相应地,克隆LID 950C可以映射951C到位于存储地址P0-3的初始、未修改的文件数据952A上。存储客户端926N可以参照新的克隆文件标识符范围950C与存储客户端926B并行执行存储操作。客户端926B和926N所做出的变化可以在其对应的LID范围950B和950C内被隔离,并且如此不可以应用于文件的原始版本(LID 950A和/或另一者)。

状态953E展示了存储客户端926B关闭文件的结果。响应于存储客户端926B请求关闭文件,存储层130可以被配置成用于在一个或多个范围合并操作中将相应范围(FID 950B)中的内容合并到文件的原始版本(LID 950A)中。然而,这些变化不可以合并到存储客户端926N在使用的文件版本(FID950C)中;存储客户端926N直到客户端926N重新打开文件时才可以访问这些修改。结合这些修改可以包括本文中所披露的一个或多个范围合并操作。这些范围合并操作可以被配置成用于参照所克隆的LID范围950B做出的修改合并到文件的原始版本的LID范围950A中。在图9F的实施例中,该范围合并操作包括将原始文件LID 950A的映射951A更新成引用位于存储地址P64的经修改的文件数据952B。客户端924B没有修改的数据可以保持绑定到位于P0-3的初始、未修改的文件数据952A上。

如本文中所披露的,在一些实施例中,经修改的文件数据952B可以包括被配置成用于使位于存储地址P64的经修改的文件数据952B与LID 950B中的一项或多项相关联的持久性元数据(与和文件的原始版本相关联的LID950A相反)。因此,范围合并操作可以进一步包括将持久性注释366附加到存储介质140,该持久性注释被配置成用于使LID 950A的范围中的一项或多项与位于存储地址P64的经修改的文件数据952B相关联。在一个或多个后台操作中,位于存储地址P64的数据可以与更新后的持久性元数据一起被重新写入。在文件关闭操作(和相应的范围合并操作)之后,转换模块134可以被配置成用于解除分配范围950B内的LID。

客户端926N可以参照所克隆的文件标识符950C来修改文件。如在图9G中的状态953F所描述的,存储客户端926N可以执行与客户端926B实现的修改相冲突的一个或多个操作。可以在客户端950B关闭文件之前(在客户端926B的修改已经应用于文件的原始版本的LID 950A之前,如在状态953E)进行修改。如此,LID 950A被映射951A到初始、未修改的文件数据952A上,分配给存储客户端926B的范围950B中的标识符中的一个或多个标识符被映射到经修改的文件数据952B上,并且分配给存储客户端926N的范围950C中的标识符中的一个或多个标识符被映射到冲突文件数据952C上。与未修改的数据相对应的LID 950B和950C可以继续引用初始、未修改的文件数据952A。

客户端926B和926C可以最终关闭其对应的文件,这可以包括将参照对应的LID范围950B和950C做出的修改合并到文件的原始版本的范围950A中。存储层130可以被配置成用于根据合并策略944解决范围950B与950C之间的冲突。在一些实施例中,合并策略944可以基于存储客户端926B和926C关闭文件的顺序;最后关闭的文件的修改可以覆写之前应用的修改(例如,可以将这些修改串行化)。如在状态953G展示的,存储客户端950B可以在存储客户端950C之前发出文件关闭请求。在客户端950B关闭文件之后,存储层130可以将参照范围950B作出的修改合并到文件的原始版本的范围950A中(如在图9F中的状态953E所展示的)。如图9G中的状态953G所展示的,客户端926C关闭文件可以引起用数据952C覆写存储客户端950B所做的修改中的一些修改(经修改的数据952B)。位于P3和P64的数据可以被标记以便从存储介质140中移除,因为其不再被原始文件或文件的当前工作版本引用。如以上所披露的,存储层130可以被配置成用于实现其他合并策略,如基于优先级的合并策略944。基于优先级的合并策略可以基于存储客户端926B和/或926C的相对优先级来解决冲突。在状态953H,存储客户端926C可以在存储客户端926B之后关闭文件;然而,由于合并策略944指示存储客户端926B的修改具有比存储客户端926C的冲突修改更高的优先级,可以保留存储客户端926B的修改。相应地,文件的原始版本的LID950A可以继续引用存储客户端926B的经修改的文件数据952B,并且存储客户端926C的冲突文件数据(位于P96的数据952C)可以标记以便与位于P3的过时文件数据952A一起垃圾回收。在其他实施例中,合并策略944可以包括冲突时拷贝策略,该策略引起创建文件的两个原始版本。在这种实施例中,并且如在状态953I展示的,存储层130可以被配置成用于将存储客户端926B的修改结合到原始文件(使用原始文件LID 950A)中,并且可以将存储客户端926C的冲突修改结合到文件的新版本(文件标识符950D)中。

尽管本文中描述了合并策略944的具体实施例,但本披露在此方面不受限制并且可以实现和/或结合任何合适的合并策略944。可以在存储层130和/或文件系统906内实现合并策略944。在一些实施例中,可以通过存储层130的接口131来配置存储层130和/或文件系统906的合并策略944。合并策略944可以适用于通过存储层130执行的所有文件操作。可替代地或此外,可以在每文件和/或每冲突的基础上通过尤其如以上披露的文件系统API调用、fadvise、ioctrl等等来设定合并策略944。

存储层130可以被进一步配置成用于实现高效的原子存储操作。图10A是包括存储层130的系统1000A的一个实施例的框图,该存储层被配置成用于实现原子存储操作。如本文中所使用的,原子存储操作是指整体被完全完成或者被回滚的存储操作。相应地,原子存储操作可以部分没有完成;存储层130可以被配置成用于使未完成的原子存储操作的数据无效和/或将其移除。实现原子存储操作、并且特别是包括多个步骤和/或与多个不同标识符范围或I/O向量有关的原子存储操作可能强加高开销成本。例如,一些数据库系统使用多个冗余写入操作集合来实现原子存储操作。

存储层130可以包括被配置成用于实现存储事务的事务模块1036。事务模块1036可以包括原子存储模块1035,该原子存储模块利用本文中所披露的范围克隆、范围移动、和/或其他操作来提高原子存储操作的效率。在一些实施例中,接口131提供API和/或接口用于执行向量化原子存储操作。向量可以被定义为数据结构,如:

iov_base参数可以引用包括向量的数据的存储器或缓冲器位置,iov_len可以是指数据缓冲器的长度或大小,并且dest_lid可以是指向量的目的逻辑标识符(例如,范围的长度从输入缓冲器iov_len隐含和/或导出的基础逻辑标识符)。

因此,将数据写入到一个或多个向量的向量存储请求可以被如下定义:

以上向量写入操作可以被配置成用于从*iov指针引用的和/或向量计数参数(iov_cnt)指定的向量数据结构中的每个向量数据结构收集数据并且将该数据写入到在对应的iovect结构中指定的目的逻辑标识符(例如,dest_lid)。标志位参数可以指定向量写入操作是否应作按照原子向量操作被实现。

如以上所展示的,向量存储请求可以包括在多个向量中的每个向量上执行相同的操作(例如,隐式地执行与一个或多个不同向量有关的写入操作)。在一些实施例中,向量存储请求可以为每个组成向量指定不同的I/O操作。相应地,每个iovect数据结构可以包括对应的操作指示符。在一些实施例中,iovect结构可以如下扩展:

iov_flag参数可以指定有待在向量上执行的存储操作。iov_flag可以指定任何合适的存储操作,其包括但不限于写入、读出、原子写入、裁剪或丢弃请求、删除请求、格式化请求、图案化写入请求(例如,写入指定图案的请求)、写入零请求、或具有验证请求、分配请求的原子写入操作等等。上述向量存储请求接口可以被扩展成接受向量结构:

标志位参数可以指定向量请求的向量操作是否应被原子地执行。阿施施·班塔瓦尔(Ashish Batwara)等人的2012年12月21日提交的标题为“Systems,Methods,and Interfaces for Vector Input/Output Operations(用于向量输入/输出操作的系统、方法和接口)”的美国专利申请序列号13/725,728中披露了原子存储操作的进一步实施例,并且该申请通过引用结合于此。

事务模块1036可以包括被配置成用于在存储层130内实现原子存储操作的原子存储模块1035。原子存储模块1035可以被配置成用于参照与原子存储请求的目标或目的标识符不同的标识符集合来实现该请求的存储操作。如本文中所披露的,在原子存储操作完成之后,原子存储模块1035可以被配置成用于将数据移至原子存储请求的对应的目标或目的标识符。

在一些实施例中,原子存储模块1035参照第二标识符集合来实现定向至第一标识符集合的原子存储操作。第二标识符集合可以被认为是短暂、临时、工作或进程内标识符。第二标识符集合不可以被存储客户端106直接访问。第二标识符集合可以与逻辑地址空间132的具体区域、具体虚拟地址空间(例如,VAS 532)、单独的命名空间等等相对应。在完成原子存储请求的存储操作之后,原子存储模块1035可以实现被配置成用于使原子存储请求的数据与第一标识符集合相关联的范围移动操作。该数据可以与第二标识符集合解除关联。如以上所描述的,第二标识符集合可以与逻辑地址空间132中的LID和/或VAS 532的VID区分开。在失败状况下,重构模块1037可以标识绑定到与失败事务(例如,未完成的原子存储操作)有关的这种标识符上的数据。可以在元数据重构操作过程中使所标识的数据失效和/或可以从存储元数据135中省略相应的条目(例如,从前向映射160、VAS前向映射560、引用映射460等等中省略)。

在一些实施例中,原子存储模块1035在单独的地址空间内实现原子存储操作,如图10A中的事务性地址空间1032。尽管图10A描述了事务性地址空间1032的用途,但本披露在此方面不受限制,并且可以被适配成使用任何合适的地址范围和/或命名空间,包括但不限于逻辑地址空间132的一部分(例如,LID范围、长度、和/或集合)、VAS 532的一部分、引用映射460、中间地址空间等等。事务性地址空间1032中的标识符(事务性标识符)不可以由存储客户端106直接访问。

原子存储模块1035可以参照事务性地址空间1032执行原子存储操作,并且在原子存储操作完成之后,可以执行原子范围移动操作,该原子范围移动操作被配置成用于将原子存储操作的数据从事务性地址空间1032移动到逻辑地址空间132中(或其他目的或目标命名空间,如具体VAS 532)。如本文中所披露的,原子范围移动操作可以包括更新前向映射160内的绑定、将元数据写入到存储介质140(例如,将持久性注释366附加到日志)、等等。

在图10A的实施例中,存储客户端106发出与逻辑地址空间132内的向量1040A和1040B有关的原子存储请求。如在图10A中所展示的,向量1040A和1040B可以与前向映射160内的现有条目相对应。在实现原子存储操作之前(在状态1015A),向量1040A的LID 10-13可以绑定到存储地址P1-P4上,并且向量1040B的LID 36-38可以绑定到存储地址P6-8上。在其他实施例中,原子存储请求可以与没有分配和/或还没有绑定至存储地址上的LID有关,并且如此不具有前向映射160(和/或其他映射层)内的相应条目。

响应于原子存储请求,原子存储模块1035可以通过使用尤其重定向模块1034来访问事务性地址空间1032内的第二标识符集合。重定向模块1034可以被配置成用于将第二标识符集合分配在事务性地址空间1032内。事务性标识符可以用于实现原子存储请求的多个部分(例如,追踪原子存储操作的进程内部分)。重定向模块1034可以被进一步配置成用于通过使用尤其存储元数据135、前向索引160内的条目和/或其他索引元数据等等使第二标识符集合与第一LID集合相链接(例如,原子存储请求的目标LID)。在一些实施例中,如本文中所披露的,原子存储模块1035可以被进一步配置成用于执行范围克隆操作,该范围克隆操作被配置成用于将第二标识符集合绑定到与第一标识符集合相同的存储地址(向量1040A和1040B)上。

如在状态1015B所展示的,重定向模块1034可以分配包括向量1042A和1042B的第二标识符集合,这些向量包括事务性标识符Z0-3和Z6-8。使用尤其中间映射层,如事务映射1060,可以将事务性标识符与存储位置之间的绑定保持在存储元数据中。事务映射1060可以包括事务性标识符与逻辑地址空间132中的LID(和/或VAS 532的VID)之间的映射。在图10A的实施例中,事务映射1060包括向量1042A的事务性标识符与向量1040A的相应LID(LID 10-13)之间的链接1064A,该事务映射1060进一步包括向量1040B的事务性标识符与向量1040B的LID 36-38之间的链接1064B。事务映射1060可以进一步包括事务性标识符与存储位置之间的绑定。状态1015B描绘了事务映射1060中的范围克隆操作,包括事务性标识符1042A与向量1040A中的LID的存储位置P1-4之间的绑定1062A、以及事务性标识符1042B与向量1040B中的LID的存储位置P6-8之间的绑定1062B。

原子存储模块1035可以在事务性地址空间1032内实现原子存储请求的原子存储操作,这可以包括将存储操作从第一LID集合(向量1040A和/或1040B)重定向至第二标识符集合(1042A和1042B中的事务性标识符)。重定向存储操作可以包括通过使用尤其事务映射1060将对原子存储请求中的LID的引用转换成第二事务性标识符集合。例如,与LID 10有关的存储操作可以基于事务映射1060中的映射1064A重定向至事务性标识符Z0。被配置成用于分配逻辑容量的存储操作可以重定向至(和保持在)事务性地址空间1032内。例如,将向量1040A扩展成包括LID 14-20的请求可以包括:a)将LID分配在逻辑地址空间132中,b)将相应的事务性标识符分配在事务性地址空间1032中,和c)使所分配的事务性标识符和LID与事务映射1060相链接。裁剪LID的请求可以包括将相应的标识符在事务映射1060中标记为无效。如本文中进一步详细披露的,可以响应于当完成原子存储操作时执行的范围移动操作而裁剪逻辑地址空间132中的相应的LID。

如在状态1015C所展示的,原子存储请求的存储操作可以包括将数据附加到存储介质140上,位于存储位置P9-13和P100-102。如本文中所披露的,相应存储操作可以被重定向至事务性地址空间1032。相应地,原子存储请求的数据可以与事务性标识符Z0-3和Z6-8相关联,这可以包括:a)将存储位置P9-13和P100-102绑定到事务映射1060中的事务性标识符Z0-3和Z6-8上,和b)将该数据和持久性元数据114一起存储在P9-13和P100-102,该持久性元数据被配置成用于使该数据与对应的事务性标识符Z0-3和Z6-8相关联。

其他存储操作可以与原子向量操作并发执行和/或与其交叉。相应地,原子存储请求的数据不需要存储在存储介质140的存储地址空间144内的连续存储位置处。原子存储请求的数据可以基于尤其位于存储位置P9-10和P100-102的数据与事务性标识符Z0-3和Z6-8之间的绑定而与不与原子存储请求相关的其他数据区分开。

如在状态1015C进一步展示的,向量1040A和1040B中的LID的初始、未修改的状态在原子存储操作正在进行时可以不变;位于存储位置P1-4和P6-8的数据可以保留在存储介质140上,并且LID 10-13和36-38的初始、未修改的数据可以保持在前向索引160中。因此,与向量1040A和1040B相对应的初始、未修改的数据在原子存储操作正在执行时可以保持在一致状态下,并且可以被保存而不管原子存储操作失败与否。

完成原子存储操作可以包括将事务性地址空间1032中的内容合并到逻辑地址空间132中。如在状态1015D所展示的,在于事务性地址空间内完成原子存储操作之后(如在状态1015C所示),原子存储模块1035可以执行范围移动操作以将位于P9-13和P100-102的数据的逻辑接口修改成将该数据绑定到第一LID集合(向量1040A和1040B中的目的LID)上。该范围移动操作可以包括将前向映射160更新成使向量1040A中的LID 10-13与存储位置P9-13相关联并且使向量1040B中的LID 36-38与存储位置P100-102相关联。如本文中所披露的,该范围移动操作可以进一步包括将持久性注释366存储在存储介质140上以将存储地址P9-P13绑定到LID 10-13上并且将P100-102绑定到LID 36-38上。该范围移动操作可以用其他方式来实现,包括但不限于图4A-E中的引用条目实施例和/或图5A-B的中间映射实施例。该范围移动操作还可以包括以与更新后的逻辑接口相一致的上下文格式重新写入数据,这可以包括将数据与持久性元数据114一起写入,该持久性元数据被配置成用于使该数据与第一LID集合(例如,分别是逻辑地址空间132中的LID 10-13和/或36-38)相关联。如本文中所披露的,可以在一个或多个后台操作中重新写入数据。

原子存储模块1035可以被配置成用于响应于范围移动操作完成而确认原子存储请求完成。相应地,可以响应于存储持久性注释366和/或将持久性注释366放置在写入缓冲器(和/或存储装置141的防断电域)内而确认完成。完成原子存储请求可以进一步包括解除分配用于实现原子存储请求的事务性标识符。

在一些实施例中,范围移动操作可以进一步包括修改在逻辑地址空间132的LID分配。如以上所披露的,原子存储操作可以包括将LID分配在逻辑地址空间132内的请求。如本文中所披露的,实现这种操作可以包括:a)将所请求的LID(或替代LID)分配在逻辑地址空间132内,b)将相应的事务性标识符分配在事务性地址空间1032内,和c)使LID与这些事务性标识符相链接。如本文中所披露的,范围移动操作可以包括移除事务性标识符和/或将与相应的事务性标识符相关联的数据移动至所分配的LID。实现裁剪一个或多个LID的操作可以包括将相应的事务性标识符在事务映射1060中标记为无效。相应的范围移动操作可以包括通过尤其从前向索引160中移除LID和/或存储指示LID已经被移除的持久性元数据来裁剪被映射到事务性标识符上的LID。在图10A的实施例中,包括裁剪LID 12的请求的原子存储请求可以包括使事务映射1060中的事务性标识符Z2失效。使事务性标识符Z2无效可以包括保留表示事务映射1060中的事务性标识符Z2的条目、和将该条目标记为无效、已删除、已裁剪等等。完成原子存储请求可以包括:a)使映射到事务性标识符Z2上的LID失效(例如,使与前向映射160中的LID 12相对应的条目和/或其他存储元数据135失效);和/或b)将持久性注释366配置成裁剪LID 12(例如,指示位于绑定至LID 12上的存储位置的数据不需要被保留在存储介质140上)。

在一些实施例中,存储层130可以进一步包括被配置成用于用存储日志中的内容重构存储元数据135的重构模块1037。重构模块1037可以响应于引起存储元数据135丢失和/或损坏的失败状况而重构存储元数据135。重构模块1037可以被配置成用于按日志顺序(例如,从最新到最旧或者反之亦然)遍历存储地址空间144内的物理存储位置。重构模块1037可以访问存储日志中的持久性元数据114以重构尤其LID与前向映射160中的存储地址的关联。

响应于图10A中的原子存储操作失败,重构模块1037可以被配置成用于分别基于P1-4和P6-8中的内容来重构向量1040A和1040B。重构模块1037可以基于数据与进程内地址空间1032中的标识符Z0-3和Z6-9的关联来识别出存储在P9-13和/或P100-102的数据与未完成的原子存储请求有关。因此,重构模块1037可以从前向索引160中省略这些条目并且使位于相应的存储位置的数据失效。可替代地,重构模块1037可以重构事务映射1060中的相应条目,这样使得可以完成部分原子存储请求(例如,与从头重新开始原子存储操作相反,从失败点开始恢复)。

重构模块1037可以被进一步配置成用于标识与已完成的原子存储请求有关的数据。当在成功完成图10A中的原子存储请求之后重构存储元数据135时,重构模块1037可以基于存储在存储位置109的持久性注释366来确定物理存储位置P9-13和P100-102与逻辑地址空间132中的LID相对应(并且是成功原子存储请求的结果)。如以上所披露的,持久性注释366可以包括被配置成用于使位于P9-13和P100-102的数据与向量1040A和1040B中的LID相关联。相应地,重构模块1037可以被进一步配置成用于通过使用持久性注释366来重构状态1015C的关联,而不管相应数据是否已经以更新后的上下文格式被重新写入与否。

图10B描绘了通过使用尤其本文中披露的存储层130和聚合层530实现的原子存储操作的进一步实施例1000B。在状态1017A,可以接收与第一VID集合有关的原子存储操作。如在状态1017A所展示的,向量4096-4159中的目标VID可以不与现有VID分配和/或数据相对应。相应地,VAS前向映射560可以不包括与VID 4096-4159相对应的条目和/或中间映射1070内的条目。

如在状态1017B所展示的,响应于原子存储请求,原子存储模块1035可以被配置成用于分配与原子存储请求相对应的VID(条目4096,64)。如果所请求的条目不可用(例如,已经被分配给另一个客户端和/或现有数据),则原子存储请求可能失败。可替代地,原子存储模块1035可以分配不同的VID集合来实现原子存储请求,当原子存储请求完成时,该VID集合可以返回至存储客户端106。

重定向模块1034可以被配置成用于分配与VID 4096,64相对应的临时、进程内标识符9872Z,64。与本文中所披露的事务性标识符一样,进程内标识符9872Z,64可以与和目标VID不同的命名空间(例如,事务性地址空间1032)、VAS 560的具体区域、单独的VAS 560等等相对应。重定向模块1034可以被配置成用于通过使用尤其VAS前向映射560内的对应条目的元数据(和/或其他存储元数据135)和/或通过使用事务映射1060(或进程内索引)来使VID 4096,64与进程内标识符9872Z,64相链接。将事务性标识符9872Z,64绑定到中间标识符1032,64上可以包括将持久性注释1066A附加到存储介质140上。持久性注释1066A可以包括被配置成用于使进程内标识符与中间标识符1032,64相关联的持久性元数据。

在状态1017C,原子存储模块1035可以被配置成用于参照进程内标识符实现与原子存储请求相对应的存储操作,这可以包括将原子存储请求的VID重定向(/或和转换)至相应的进程内标识符。存储操作可以包括通过使用尤其日志存储模块137来将数据附加到存储介质140上。进程内标识符9872Z,64可以通过中间映射层1070(标识符1032,64)和/或持久性注释1066A绑定到所附加的数据上。附加到存储日志上的数据可以包括被配置成用于将原子存储操作的数据绑定到对应的中间标识符1032,64上的持久性元数据114。持久性元数据114可以进一步包括被配置成用于将该数据标识为原子存储请求的一部分的标志位、或其他指示符。

完成原子存储请求可以包括范围移动操作,该范围移动操作被配置成用于将所附加的数据的逻辑接口修改成将该数据绑定到原子存储请求的目的VID(VID 4096,64)上。在完成原子存储请求的存储操作之后,原子存储模块1035可以通过尤其以下内容实现范围移动操作:a)将VAS前向映射560更新成使目标VID 4096,64与中间条目1032,64相关联;和b)移除进程内标识符9872Z,64与中间条目1032,64之间的映射。

范围移动操作可以进一步包括解除分配进程内标识符9872Z,64(例如,如以上所披露的,从进程内索引1060中移除条目和/或相应的元数据)。如在状态1017D,范围移动操作可以进一步包括将另一个持久性注释1066B附加到存储介质140上,该持久性注释可以被配置成用于标识所附加的数据的经修改的逻辑接口。持久性注释1066B可以将中间条目1032,64绑定到目的VID范围4096,64上。持久性注释1066B可以进一步指示原子存储操作成功完成。原子存储模块1035可以被配置成用于响应于将持久性注释1066B存储在存储介质140上(和/或调度持久性注释1066B存储在例如防断电域内)而确认原子存储请求完成。

如以上所披露的,在一些实施例中,原子存储模块1035实现的范围移动操作可以包括对目标命名空间(例如,逻辑地址空间132)的修改。在一个实施例中,例如,原子存储请求可以包括裁剪I/O向量的请求。如以上所披露的,实现原子存储请求可以包括将持久性注释366存储在存储日志内,该持久性注释被配置成用于裁剪相应的进程内或事务性标识符。范围移动操作可以包括在目标命名空间内实现裁剪操作。裁剪操作可以包括如本文中所披露的将持久性注释1066B配置成裁剪目标I/O向量和/或将所存储的裁剪命令移动至目标I/O向量。

如以上所披露的,在失败状况下,重构模块1037可以使用持久性注释1066B来重建存储元数据135。重构模块1037可以重建中间映射1070和/或VAS前向映射560中的绑定。在状态1017D,重构模块1037可以通过使用与相应数据一起存储在日志内(例如,在对应的包头内)的持久性元数据114来重构1032,64与相应存储地址之间的关联。重构模块1037可以进一步被配置成用于通过使用持久性注释1066B使中间地址1032,64与VID4096,64相关联。

如状态1017E所展示的,重构模块1037可以响应于确定指示原子存储请求完成的持久性注释1066B不存在于存储介质140上而标识已失败的原子存储操作的数据。重构模块1037可以响应于标识绑定至中间标识符1032,64上的数据来确定所附加的数据是未完成的已失败原子存储请求的一部分,这些中间标识符:a)被绑定至进程内标识符9872Z,64上和/或b)被标记为原子(在对应的持久性元数据114中)。作为响应,重构模块1037可以:a)从中间映射1070中移除和/或省略条目1032,64,b)从VAS前向映射560中移除和/或省略条目4096,64和/或9872Z,64,和/或c)使存储介质140上的相应数据失效。

图11是用于对以上下文格式存储在非易失性存储器上的数据的逻辑接口进行管理的方法1100的一个实施例的流程图。

步骤1120可以包括对以上下文格式存储在非易失性存储器上的数据的逻辑接口进行修改。可以响应于对数据执行操作而在步骤1120修改该逻辑接口,这可以包括但不限于克隆操作、去重复操作、移动操作等等。该请求可以源自存储客户端106、存储层130(例如,去重复模块374)等等。

修改逻辑接口可以包括修改与数据相关联的LID,这可以包括但不限于使用与一个或多个附加LID引用数据(例如,克隆、去重复等)、改变与该数据相关联的LID(例如,移动)等等。如以上所描述的,经修改的逻辑接口可能与存储介质140上的数据的上下文格式不一致。

步骤1120可以进一步包括将标识对逻辑接口的修改的持久性注释存储在存储介质140上。该持久性注释可以用于使逻辑操作持久和防崩溃,这样使得可以用存储介质140中的内容重构数据的经修改的逻辑接口(例如,存储元数据135)(如果有必要的话)。步骤1120可以进一步包括确认逻辑接口已经被修改(例如,从API调用中返回,返回显式确认等等)。在数据的上下文格式在存储介质140上被更新之前进行确认(和在步骤1130通过经修改的逻辑接口访问)。相应地,逻辑操作可以不等到数据被重新写入和/或重新安置;如本文中所披露的,更新数据的上下文格式可以被推迟和/或在方法1100的“关键路径”和/或用于服务其他存储操作和/或请求的路径之外的进程中被实现。

步骤1130可以包括提供通过步骤1120中的经修改的逻辑接口访问不一致上下文格式的数据。如以上所描述的,将数据的上下文格式更新为与经修改的上下文接口相一致可以包括将数据重新写入和/或重新安置在非易失性存储介质上,这可以选择对步骤1120中的操作和/或与经修改的逻辑接口有关的其他存储操作强加附加延迟。因此,存储层130可以被配置成用于在数据的上下文格式被更新时(或之前)提供对不一致上下文格式的数据的访问。如以上所描述的,在步骤1130提供对数据的访问可以包括引用与该数据相对应的一个或多个引用条目和/或将其相链接(经由一个或多个间接条目)。

步骤1140可以包括将存储介质140上的数据的上下文格式更新成与步骤1120中的经修改的逻辑接口相一致。步骤1140可以包括将数据重新写入和/或重新安置到存储介质140上的另一个介质存储位置上。如以上所描述的,可以使用在步骤1120的关键路径之外的进程和/或存储层130所执行的其他存储请求来实现步骤1140;步骤1140可以由另一个自主模块实现,如介质管理模块370、去重复模块374等等。相应地,数据的上下文格式被更新,独立于服务其他存储操作和/或请求。如此,步骤1140可以包括推迟数据的上下文格式的立即更新并且在一个或多个“后台”进程(如介质管理进程)中更新数据的上下文格式。可替代地或此外,可以响应于其他存储操作(例如,与其一起)进行更新数据的上下文格式。例如,修改数据的后续请求可以引起不在原地并且以更新后的上下文格式重新写入数据。

步骤1140可以进一步包括当更新数据的上下文格式时更新存储元数据135。随着以更新后的上下文格式重新写入和/或重新安置数据,存储层130可以相应地更新存储元数据135(例如,前向映射160)。如以上所描述的,这些更新可以包括移除与引用映射460中的引用条目的一个或多个链接和/或用本地条目替换间接条目。如以上所披露的,步骤1140可以进一步包括响应于更新数据的上下文格式和/或使存储元数据135持久化而使持久性注释失效和/或从存储介质140中将其移除。

图12是用于对以上下文格式存储在非易失性存储器上的数据的逻辑接口进行管理的方法1200的另一个实施例的流程图。如在此所披露的,可以由存储层130中的一个或多个存储模块和/或部件实现方法1200。

步骤1220包括选择供恢复的存储分区,如擦除块或逻辑擦除块。如以上所描述的,步骤1220中的选择可以基于多个不同的因素,如可用存储容量不足、检测到具体逻辑擦除块内的被标记为无效的数据的百分比达到阈值、有效数据的整合、错误检测率达到阈值、改进数据分布、数据刷新等等。可替代地或此外,步骤1220中的选择判据可以包括存储分区是否包括如以上所描述的呈与其相应逻辑接口不一致格式的数据。

如以上所描述的,恢复(或收回)存储分区可以包括擦除存储分区和将其上的有效数据(如果有的话)重新安置到非易失性存储介质上的其他存储位置。步骤1230可以包括确定在梳理操作中有待重新安置的数据的上下文格式是否应被更新(例如,与数据的逻辑接口不一致)。步骤1230可以包括访问如以上所描述的存储元数据135,如前向映射160、引用映射460和/或中间地址空间,以确定数据的持久性元数据(例如,逻辑接口元数据)是否与数据的存储元数据135一致。如果持久性元数据不与存储元数据135一致(例如,如以上所描述的,使数据与不同的LID相关联),则流程在步骤1240继续进行;否则,该流程在步骤1250继续进行。

步骤1240可以包括将数据的上下文格式更新成与数据的逻辑接口相一致。如以上所描述的,步骤1240可以包括将逻辑接口修改成引用不同的LID集合(和/或引用条目)。

步骤1250包括以日志格式将数据重新安置到不同的存储位置,如以上所描述的,该日志格式保存在非易失性存储介质上执行的存储操作的有序序列。相应地,当重构存储元数据135(如有必要的话)时,所重新安置的数据(以更新后的上下文格式)可以被标识为数据的有效和最新版本。如本文中所披露的,步骤1250可以进一步包括将存储元数据135更新成将数据的逻辑接口绑定到数据的新介质存储位置上、移除不一致上下文格式的数据的间接和/或引用条目等等。

图13是用于对以上下文格式存储的数据的逻辑接口进行管理的方法1300的另一个实施例的流程图。步骤1315可以包括标识一个或多个存储装置120上的重复数据。步骤1315可以由在存储层130内操作的去重复模块374来执行。可替代地,当执行存储操作时,步骤1320可以由存储层130执行。

步骤1315可以包括确定和/或验证存储介质140包括重复数据(或已经包括写入和/或修改请求的数据)。相应地,步骤1320可以在存储操作的路径内进行(例如,当重复数据被写入到存储介质140时或之前)和/或可以在服务存储操作的路径之外进行(例如,标识已经存储在存储介质140上的重复数据)。步骤1320可以包括生成数据签名和/或将其保持在存储元数据135中并且使用这些签名标识重复数据。

响应于在步骤1315标识重复数据,存储层130(或其他模块,如去重复模块374)可以修改数据的副本的逻辑接口,这样使得单个副本可以被两个(或更多个)LID集合引用。在步骤1320对逻辑接口的修改可以包括更新存储元数据135和/或将持久性注释存储在非易失性存储介质上。如以上所描述的,步骤1320可以进一步包括使非易失性存储介质上的数据的其他副本失效和/或将其移除。

存储介质140上的数据的上下文格式可以与经修改的逻辑接口不一致。因此,如以上所描述的,步骤1330和1340可以包括提供通过经修改的逻辑接口访问不一致的上下文格式的数据并且更新存储介质140上的数据的上下文格式。

图14是本文中披露的存储层130实现的范围合并操作的一个实施例的流程图。步骤1410可以包括在逻辑地址空间132内克隆LID集合。克隆LID可以包括通过两个或更多个不同的LID集合引用存储介质140上的相同数据集(例如,相同存储位置和/或存储地址)。两个或更多个集合可以包括工作LID集合和初始一致性LID集合。工作LID集合可以用于执行文件修改操作,而初始一致性LID集合可以被配置成用于保持数据的初始、未修改的状态。

如以上所披露的,在步骤1410克隆的数据可以被LID集合引用,该集合可以被绑定到存储介质140上的数据的存储位置上。步骤1410可以包括将一个或多个其他LID集合分配在逻辑地址空间132内和/或在单独的地址空间内。该一个或多个其他LID集合可以包括与初始LID集合的逻辑容量相当的逻辑容量(例如,包括相同数量的LID和/或与相同量的存储容量相对应)。步骤1410可以进一步包括使该一个或多个其他LID集合中的逻辑标识符与初始LID集合引用的相同数据相关联和/或绑定。相应地,步骤1410可以包括将数据的逻辑接口修改成使该数据与两个或更多个不同的LID集合相关联。在一些实施例中,步骤1410包括将一个或多个LID集合分配在逻辑地址空间132内并将这些LID绑定到相同的存储地址集合上。可替代地或此外,如结合图4A-E所披露的,步骤1410可以包括在引用映射460内创建一个或多个引用条目来通过一个或多个引用条目将两个或更多个LID集合中的LID与存储地址间接相链接。可替代地,可以通过使用一个或多个中间映射层(例如,如结合图5A-B披露的)来实现步骤1410。步骤1410可以进一步包括通过尤其与LID相关联的元数据984和/或994来使两个或更多个LID集合相链接。元数据984和/或994可以被配置成用于指示这些LID集合表示相同存储实体的克隆品(例如,相同文件的多个版本)。如以上所披露的,元数据984和/或994可以进一步被配置成用于指定和/或引用两个或更多个LID集合的合并策略。

步骤1410可以进一步包括将持久性注释366存储在存储介质140上,该持久性注释被配置成用于使步骤1410中的克隆操作持久并防崩溃。持久性注释366可以被配置成用于指示数据的经修改的逻辑接口(例如,使数据与两个或更多个LID集合相关联),指示克隆操作的合并策略等等。

步骤1420可以包括在步骤1410中的不同LID范围中的一者或多者内执行存储操作。可以响应于通过接口131从一个或多个存储客户端106接收的请求来执行存储操作。这些存储操作可以包括将数据附加至存储介质140上。因此,这些存储操作可以包括修改一个或多个LID集合中的LID与存储介质140上的存储位置之间的关联和/或绑定。修改这些关联和/或绑定可以进一步包括直接和/或通过一个或多个间接引用和/或映射层将LID集合中的一个或多个集合中的LID映射到所附加的数据上。

如以上所披露的,步骤1430可以包括合并LID集合。如以上所披露的,合并LID集合可以包括将在这些LID范围之一中做出的修改结合到LID集合中的一个或多个集合中。步骤1430可以进一步包括根据合并策略解决一个或多个合并冲突。在一些实施例中,合并包括删除(例如,使失效)LID集合中的一个或多个集合,这可以包括从前向映射160中移除条目、从引用计数数据结构中移除对存储位置的共享引用项、从引用映射460中移除引用条目、移除中间映射层中的引用项、等等。如以上所披露的,步骤1430可以进一步包括修改合并数据的逻辑接口。经修改的逻辑接口可以参照LID集合中的一个或多个集合更新用于引用初始存储的数据的LID。经修改的逻辑接口可能与存储介质140上的数据的上下文格式不一致。因此,步骤1430可以包括将一个或多个持久性注释366附加在存储介质140上以使合并数据与数据的更新后的逻辑接口相关联(例如,使联合第二集合中的LID一起初始存储的数据与第一集合中的LID相关联)。步骤1430可以进一步包括在一个或多个后台操作中提供对不一致的上下文格式的数据的访问和/或更新数据的上下文格式。

图15是用于范围合并操作的方法1500的另一个实施例的流程图。步骤1520可以包括接收创建LID范围的逻辑副本的请求。该请求可以通过接口131从存储客户端106中接收和/或可以是存储层130提供的更高级API的一部分。该请求可以包括克隆品的“操作模式”,其可以包括但不限于克隆品应如何被同步化(如果发生的话);应如何进行合并(合并策略);逻辑副本是否应被指定为短暂的;等等。

步骤1530可以包括将LID分配在逻辑地址空间132中以服务该请求。步骤1530中的分配可以进一步包括预留物理存储空间来容纳所克隆的LID范围的变化。可以根据克隆品的操作模式预测物理存储空间的预留。例如,如果所有变化应在克隆品与初始地址范围之间被同步化,则可以预留物理存储空间的一小部分(如果有的话)。可替代地,存储层130可以为具有冲突时拷贝合并策略的逻辑拷贝操作预留附加物理存储容量。步骤1530可以进一步包括将克隆品分配在逻辑地址空间132的指定部分或区段内(例如,专用于和逻辑拷贝和/或克隆操作一起使用的范围)。相应地,步骤1530可以包括分配第二不同的LID集合来克隆第一LID集合。

步骤1540可以包括更新与克隆品相对应的数据的逻辑接口以引用被绑定到该数据上的初始LID以及在步骤1530分配的克隆LID两者。如以上所披露的,步骤1540可以包括将持久性注释366存储在存储介质140上。

步骤1550包括接收存储请求和确定该存储请求是否与第一和/或第二集合(所克隆的LID范围)中的LID有关。如果有关,则该流程在步骤1560继续进行;否则,该流程留在步骤1550。

步骤1560可以包括确定应对其他相关联的LID范围采取什么(如果有的话)操作(例如,使分配操作同步等)。步骤1560中的确定可以包括访问元数据984和/或994,这可以包括和/或引用克隆品的同步策略。

步骤1570可以包括执行在步骤1560确定的操作(如果有的话)和所请求的存储操作。如果这些同步操作中的一个或多个同步操作不能被执行(例如,克隆品中的一个或多个克隆品的附加逻辑地址空间132不能被分配),则底层存储操作可能失败。

图16是用于实现范围克隆和/或范围合并操作的方法1600的另一个实施例的流程图。如以上所披露的,步骤1610可以包括克隆LID范围。步骤1610可以包括克隆与存储在存储介质140上位于对应的存储地址的数据相关联的LID集合。因此,步骤1610可以包括使两个或更多个LID集合与同一存储位置集合(例如,相同数据)相关联。如以上所披露的,步骤1610可以进一步包括将一个或多个持久性注释366存储在存储介质140上和/或以更新后的上下文格式重新写入数据。步骤1610可以包括通过尤其元数据984和/或994来使两个或更多个LID集合相链接。如以上所披露的,元数据984和/或994可以包括和/或引用克隆同步测量、合并策略等等。

步骤1620可以包括参照两个或更多个所克隆的LID范围中的一个或多个范围来执行存储操作。步骤1620可以包括使克隆范围之间的分配操作同步。步骤1620中的存储操作可以包括将数据附加到存储介质140上和/或使所附加的数据与不同LID范围中的一个或多个范围中的LID相关联。

步骤1630包括接收合并步骤1610中的两个或更多个LID范围的请求。该合并请求可以通过接口131来接收和/或可以是另一个更高级操作的一部分,如原子存储操作等等。

步骤1640可以包括标识两个或更多个LID集合之间的合并冲突(如果有的话)。标识合并冲突可以包括标识在两个或更多个所克隆的LID范围中的多于一个范围内修改的LID。往回参照图9C,步骤1640可以包括响应于确定范围914中的LID 072-073被修改而标识状态941D中的合并冲突,范围924中的相应LID 972-973也一样。如此,步骤1640可以包括在合并操作中将LID克隆品内的修改进行比较以标识将映射到同一LID上的冲突修改的情况。

步骤1650可以包括解决在步骤1640标识的合并冲突。步骤1650可以包括确定适用的合并策略,如以上披露的,该合并策略可以确定应如何解决合并冲突。合并策略可以通过保持LID范围的单独副本来指定LID的哪一版包括在合并后的LID范围内和/或冲突是否被解决。如以上所披露的,步骤1650可以进一步包括根据所解决的合并冲突来合并LID范围。

图17是用于实现原子存储操作的方法1700的一个实施例的流程图。步骤1710可以包括访问与原子存储请求的第一标识符集合相对应的第二标识符集合。可以响应于和第一标识符集合(例如,目标LID、VID等等)有关的原子存储请求来执行步骤1710。第一标识符集合可以与存储在存储介质140上的现有数据相对应。可替代地,原子存储请求可以包括将第一标识符集合中的一些(或所有)标识符分配在逻辑地址空间132或VAS 532内的请求。原子存储请求可以与和不同、不相交的LID和/或VID的向量有关的多个存储操作相对应。相应地,第一标识符集合可以包括多个不相交的I/O向量。

在一些实施例中,步骤1710包括将与第一标识符集合相对应的标识符分配在单独的地址空间中,如事务性地址空间1032、中间索引1070、VAS 532等等。可替代地,步骤1710可以包括将标识符分配在逻辑地址空间132的具体范围或区域内。步骤1710可以包括分配具有与第一标识符集合相同量和/或逻辑容量的相应标识符集合。如本文中所披露的,可以通过使用尤其重定向模块1034来访问和/或分配第二标识符集合。如本文中所披露的,步骤1710可以进一步包括通过使用尤其事务映射1060来使第一和第二标识符集合相链接。

步骤1710可以进一步包括实现范围克隆操作从而将第二标识符集合绑定到第一标识符集合的数据(如果有的话)上。范围克隆操作可以使用本文中披露的克隆实施例中的任何克隆实施例来实现,包括但不限于图3A-E中的范围克隆实施例、图4A-E中的引用条目实施例、和/或图5A-B的中间映射层实施例。

步骤1720可以包括参照在步骤1710访问的第二标识符集合来实现原子存储请求的存储操作。步骤1720可以包括将存储操作从第一标识符集合重定向至第二标识符集合(例如,如本文中所披露的,在第一和第二标识符集合之间转换)。步骤1720中的存储操作可以包括通过使用尤其日志存储模块137来将数据附加到存储介质140上。步骤1720中的存储操作可以包括但不限于:a)分配存储资源的操作(例如,分配逻辑和/或物理存储资源的操作)、b)解除分配存储资源的操作(例如,裁剪、持久裁剪等等)、c)将数据写入到存储日志、d)修改存储在存储介质140上的现有数据、e)覆写存储在存储介质140上的数据等等。日志存储模块136可以被配置成用于在存储地址空间144内不在原地实现存储操作,这样使得被配置成用于修改、覆写和/或替换存储在存储介质140上的现有数据的操作附加到存储日志,而有待修改、覆写、和/或被所附加的数据替换的数据在存储介质140上保持不变。

在步骤1720写入到存储介质140的数据可以包括被配置成用于指示数据的逻辑接口的持久性元数据114。持久性元数据114可以被配置成用于将数据绑定至在步骤1710访问的第二标识符集合上。可替代地或此外,持久性元数据114可以被配置成用于将所附加的数据绑定至中间地址空间中的标识符上,这些数据可以通过尤其存储在存储日志内的持久性注释366绑定到第二标识符集合上。在一些实施例中,持久性元数据114可以进一步被配置成用于指示数据是原子存储操作的一部分。可替代地或此外,通过使用持久性元数据114(例如,通过数据与第二标识符集合之间的关联),数据可以被标识为原子存储操作的一部分。

步骤1730可以包括完成原子存储请求。完成原子存储请求可以包括范围移动操作,该范围移动操作被配置成用于参照第二标识符集合将在步骤1720实现的存储操作的数据移动至第一目标标识符集合。范围移动操作可以在单个原子写入操作中完成。单个原子写入操作可以包括将持久性元数据存储在存储介质140上(例如,持久性注释366和/或1066B)的操作。持久性元数据可以被配置成用于将在步骤1720写入的数据的逻辑接口修改成将该数据绑定到第一标识符集合(例如,原子存储请求的目标LID或VID)上。持久性元数据可以被配置成用于修改多个不同的存储向量的逻辑接口(例如,多个不同的、不连续的标识符集合)。步骤1730可以进一步包括将存储元数据135更新成通过第一标识符集合引用所附加的数据,这可以包括修改前向索引160、引用映射460、中间映射层1070等等中的一个或多个映射。

步骤1730可以进一步包括以被配置成用于使在1720存储的数据与第一逻辑标识符集合相关联的上下文格式写入该数据。如本文中所披露的,可以在一个或多个后台操作中重新写入数据。存储层130和/或聚合层530可以在重新写入数据之前提供通过第一标识符集合对数据的访问。

步骤1730可以进一步包括确认完成原子存储请求。可以响应于将持久性元数据(持久性注释366和/或1066B)存储在存储介质140上和/或在合理确定性内确定持久性元数据将存储在存储介质140上而确认完成。

图18是用于原子存储操作的方法1800的另一个实施例的流程图。步骤1810可以包括接收原子存储请求。可以通过尤其存储接口131在存储层130接收原子存储请求。可替代地,可以通过聚合层530中的接口531接收原子存储请求。该原子存储请求可以包括有待在对应的I/O向量内执行的多个原子存储操作,其中每个原子存储操作可以与不同的对应的目标LID和/或VID集合相对应。

步骤1820可以包括参照事务性或进程内标识符集合来实现原子存储请求的存储操作。事务性标识符可以与逻辑地址空间132的具体区域、VAS 532(或具体VAS 532内的区域)、单独命名空间(如以上所披露的事务性地址空间1032)、等等相对应。步骤1820可以包括分配和/或标识与原子存储请求的目标标识符相对应的事务性标识符;事务性标识符可以包括与向量化原子存储请求的I/O向量相对应的多个标识符范围和/或长度。在一些实施例中,事务性标识符可以被分配和/或标识在与目标标识符不同的范围和/或长度内。例如,用于实现与两个不连续的LID范围1024-2048和6144-7186相对应的原子存储操作的事务性标识符可以在单个临时标识符范围10240-12288或多个更小的事务性标识符范围和/或长度内实现。事务性标识符可以通过使用尤其存储元数据135与目标标识符相链接。在一些实施例中,事务性标识符可以与事务映射1060中的目标标识符相链接。事务映射1060可以进一步被配置成将事务性标识符绑定到与目标LID和/或VID相对应的存储位置上。

步骤1820可以进一步包括参照事务性标识符来实现原子存储请求的存储操作。可以根据目标或目的命名空间(如逻辑地址空间132、VAS 532等等)内的资源可用性来预测这些原子存储操作中的一个或多个原子存储操作。在一些实施例中,例如,原子存储请求可以包括分配具体LID集合的请求。因此,步骤1820可以包括通过使用尤其如以上所披露的一个或多个持久性注释366而在目标命名空间内暂时地预留逻辑容量。如以上所披露的,步骤1820可以进一步包括分配和/或预留相应的事务性标识符。响应于分配操作失败,原子存储模块1035可以:a)使原子存储请求失败,b)在目标命名空间内分配和/或预留不同的目标LID集合,这可以在原子存储操作完成时被返回。

步骤1820中的存储操作可以进一步包括将数据联合持久性元数据114一起附加到存储日志,该持久性元数据被配置成用于将数据标识为原子存储操作的一部分。持久性元数据可以包括步骤1810中的事务性标识符。可替代地或此外,持久性元数据可以包括被配置成用于指示数据是未完成的原子存储操作的一部分的原子存储标志位(或其他数据)。

步骤1830可以包括完成原子存储请求。步骤1830可以包括结束在步骤1820实现的原子存储请求。结束原子存储请求可以包括执行范围移动操作以将步骤1820中的存储操作的数据绑定至目标标识符上,这可以包括将存储元数据135更新成将目标标识符映射到在步骤1820中的存储操作中存储的数据上。如以上所披露的,范围移动操作可以进一步包括在目标命名空间内实现一个或多个裁剪操作。完成原子存储请求可以进一步包括将持久性元数据存储在存储介质140上,该持久性元数据被配置成用于:a)将原子存储请求的数据绑定至目标标识符上,和/或b)指示原子存储请求已经完成。持久性元数据可以在单个存储操作中被附加到存储日志(例如,在持久性注释366和/或1066B中)。步骤1830可以进一步包括确认完成原子存储请求。可以响应于完成范围移动操作和/或存储相应的持久性元数据而确认完成。

图19是用于原子存储操作的方法1900的另一个实施例的流程图。步骤1910可以包括访问存储介质140上的存储日志。步骤1910可以由重构模块1037执行以便在失败状况之后重构存储元数据135。重构模块1037可以被配置成用于根据存储日志的日志顺序访问存储日志。重构模块1037可以被配置成用于标识存储日志内的最新附加点,并且按反向日志顺序(例如,从日志的开头向结尾)遍历存储日志。

步骤1920可以包括标识未完成的原子存储请求的数据。步骤1920可以包括标识被绑定至事务性或进程内标识符和/或事务性和/或进程内地址空间1032中的标识符上的数据。步骤1920可以包括访问与数据段一起存储在存储日志中的持久性元数据114。步骤1920可以进一步包括确定存储日志内的其他持久性元数据不能修改所标识的数据绑定(例如,没有使数据段与不同地址空间内的标识符相关联,如逻辑地址空间132和/或VAS 532)。

步骤1930可以包括从存储元数据135中省略所标识的数据段,这可以包括使包括该数据的存储位置失效,并且从前向映射160、中间映射层1070等等中省略与这些数据段相对应的条目。因此,步骤1930可以包括回滚已失败的原子存储操作,这样使得部分完成的原子存储操作的数据不影响目标标识符和/或命名空间。

本披露已经参照了已经参照了各示例性实施例。然而,本领域技术人员将认识到,在不脱离本披露的范围的情况下可以对示例性实施例进行改变和修改。例如,可以取决于特定应用或考虑与系统的操作相关联的任何数量的成本函数以替代性方式实现各操作步骤以及用于实现操作步骤的部件(例如,可以删除、修改这些步骤中的一个或多个步骤或将其与其他步骤组合)。因此,有待在示意性而非限制性的意义上看待本披露,并且所有此类修改都旨在包括在其范围内。同样,在上文中关于各实施例描述了益处、其他优点、和问题的解决方案。然而,益处、优点、问题的解决方案、以及会导致任何益处、优点、或解决方案发生或变得更加显著的任何元素不应被理解为关键的、需要的、或至关重要的特征或元素。如本文中所使用的,术语“包括(comprises)”、“包括(comprising)”及其任何其他变体旨在覆盖非排他性包含,这样使得包括一系列元素的方法、物品、或装置不仅仅包括那些元素并且可以包括其他未清楚地列出或这种过程、方法、系统、物品、或装置固有的元素。同样,如在此所使用的,术语“耦合(coupled)”、“耦合(coupling)”及其任何其他变体旨在覆盖物理连接、电连接、磁性连接、光学连接、通信连接、功能性连接、和/或其他连接。

另外,如本领域普通技术人员将认识到的,本披露的原理将反映在机器可读存储介质上的计算机程序产品中,该计算机程序产品具有嵌入在存储介质中的机器可读程序代码装置。可以利用任何有形的、非瞬态机器可读存储介质,包括磁性存储设备(硬盘、软盘等)、光学存储设备(CD-ROM、DVD、蓝光光盘等)、闪存存储器等。可以将这些计算机程序指令加载到通用计算机、专用计算机、或另一种可编程数据处理装置上以产生一种机器,这样使得在该计算机或另一种可编程数据处理装置上执行的指令创造用于实现所指定的功能的装置。这些计算机程序指令还可以存储在机器可读存储器中,该机器可读存储器可以指示计算机或其他可编程数据处理装置以特定方式运行,这样使得机器可读存储器中所存储的指令产生制品,该制品包括实现所指定的功能的实现装置。还可以将计算机程序指令加载至计算机或其他可编程数据处理装置上以致使对该计算机或其他可编程装置执行一系列操作步骤从而产生计算机实现的过程,这样使得在计算机或其他可编程装置上执行的指令提供用于实现所指定的功能的步骤。

虽然已经在各实施例中示出了本披露的原理,但在不背离本披露的原则和范围的情况下可以使用特定适用于特定环境和操作要求的结构、安排、比例、元素、材料、部件的许多修改。这些和其他变化和修改都旨在被包括在本披露内容的范围内。

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