发明内容
针对现有技术中的缺陷,本发明提供一种基于位图的双控制器的高速缓冲存储器回写方法及装置,能够大幅度降低IO锁的持有时间,能够将回写的异步IO处理的时间从回写持有IO所的时间中移出,降低与IO处理之间的锁的冲突。
第一方面,本发明提供一种基于位图的双控制器的高速缓冲存储器回写方法,包括:
建立高速缓冲存储器的位图数据结构;
根据所述位图数据结构,对所述高速缓冲存储器进行写数据;
其中,所述位图数据结构包括脏数据位,本地回写位,对端回写位和写数据位。
进一步地,所述方法还包括:
在对所述高速缓冲存储器回写启动时,启用所述回写高速缓冲存储器的位图保护;
在对所述高速缓冲存储器回写完成时,解除所述回写高速缓冲存储器的位图保护。
进一步地,所述根据所述位图数据结构,对所述高速缓冲存储器进行写数据步骤之前,还包括:
获取高速缓冲存储器的IO锁。
进一步地,所述根据所述位图数据结构,对所述高速缓冲存储器进行写数据,包括:
获取第一端的本地回写位,将所述本地回写位存储于高速缓冲存储器,将所述本地回写位发送至第二端;
所述第二端接收所述第一端的本地回写位,所述第二端将所述第一端的本地回写位记录在所述第二端的对端回写位,所述第二端创建对端回写组,将所述第二端的对端回写组的句柄发送给所述第一端;
所述第一端接收到所述对端回写组的句柄,将所述IO锁释放。
进一步地,所述根据所述位图数据结构,对所述高速缓冲存储器进行写数据,还包括:
在所述本地回写位或所述对端回写位置为1时,且所述写数据位置为0时,所述第一端在写IO时,将所述写数据位置为1;
在所述写数据位由0置为1时,在缓存数据被替换前,所述第一端不释放已有数据,而所述第二端释放已有数据,在所述写数据位已经被置为1时,在缓存数据被替换前释放已有数据,在所述写数据位无位图结构保护时,在缓存数据替换前释放已有数据;
在所述回写IO完成时,在所述写数据位为1时,将所述IO引用的高速缓冲存储器中的数据释放;
将所述本地回写位置为0,并将所述写数据位置为0,获取本地回写的结果,根据所述本地回写的结果,修改所述本地的脏数据位;
将所述本地回写的结果发送给所述第二端,所述第二端清除第二端的脏数据位和所述第二端的对端回写位。
第二方面,本发明提供了一种基于位图的双控制器的高速缓冲存储器回写装置,包括:
创建模块,用于建立高速缓冲存储器的位图数据结构;
写数据模块,用于根据所述位图数据结构,对所述高速缓冲存储器进行写数据;
其中,所述位图数据结构包括脏数据位,本地回写位,对端回写位和写数据位。
进一步地,所述写数据模块还用于在对所述高速缓冲存储器回写启动时,启用所述回写高速缓冲存储器的位图保护;
在对所述高速缓冲存储器回写完成时,解除所述回写高速缓冲存储器的位图保护。
进一步地,所述装置还包括:
获取模块:获取高速缓冲存储器的IO锁。
进一步地,所述写数据模块,还用于获取第一端的本地回写位,将所述本地回写位存储于高速缓冲存储器,将所述本地回写位发送至第二端;
所述第二端接收所述第一端的本地回写位,所述第二端将所述第一端的本地回写位记录在所述第二端的对端回写位,所述第二端创建对端回写组,将所述第二端的对端回写组的句柄发送给所述第一端;
所述第一端接收到所述对端回写组的句柄,将所述IO锁释放。
进一步地,所述写数据模块,还用于在所述本地回写位或所述对端回写位置为1时,且所述写数据位置为0时,所述第一端在写IO时,将所述写数据位置为1;
在所述写数据位由0置为1时,在缓存数据被替换前,所述第一端不释放已有数据,而所述第二端释放已有数据,在所述写数据位已经被置为1时,在缓存数据被替换前释放已有数据,在所述写数据位无位图结构保护时,在缓存数据替换前释放已有数据;
在所述回写IO完成时,在所述写数据位为1时,将所述IO引用的高速缓冲存储器中的数据释放;
将所述本地回写位置为0,并将所述写数据位置为0,获取本地回写的结果,根据所述本地回写的结果,修改所述本地的脏数据位;
将所述本地回写的结果发送给所述第二端,所述第二端清除第二端的脏数据位和所述第二端的对端回写位。
由上述技术方案可知,通过本发明提供的基于位图的双控制器的高速缓冲存储器回写方法及装置,其中方法包括:建立高速缓冲存储器的位图数据结构;根据所述位图数据结构,对所述高速缓冲存储器进行写数据;其中,所述位图数据结构包括脏数据位,本地回写位,对端回写位和写数据位。通过本发明提供的一种基于位图的双控制器的高速缓冲存储器回写方法及装置,能够大幅度降低IO锁的持有时间,能够将回写的异步IO处理的时间从回写持有IO所的时间中移出,降低与IO处理之间的锁的冲突。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整的描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他的实施例,都属于本发明保护的范围。
图1为本发明一实施例提供的一种基于位图的双控制器的高速缓冲存储器回写方法的流程示意图,如图1所示,本实施例提供的基于位图的双控制器的高速缓冲存储器回写方法如下所述。
101、建立高速缓冲存储器的位图数据结构。
应理解的是,所述位图数据结构包括脏数据位(dirtybit),本地回写位(localflushingbit),对端回写位(peerflushingbit)和写数据位(overwritebit)。
获取高速缓冲存储器的IO锁。
102、根据所述位图数据结构,对所述高速缓冲存储器进行写数据。
应理解的是根据位图中的数据结构在写操作的过程中进行标志数据结构中的符号,对高速缓冲存储器进行写操作。
通过本实施例提供的基于位图的双控制器的高速缓冲存储器回写方法,能够大幅度降低IO锁的持有时间,能够将回写的异步IO处理的时间从回写持有IO所的时间中移出,降低与IO处理之间的锁的冲突。
图2为本发明另一实施例提供的一种基于位图的双控制器的高速缓冲存储器回写方法的流程示意图,如图2所示,本实施例提供的基于位图的双控制器的高速缓冲存储器回写方法如下所述。
201、获取第一端的本地回写位,将所述本地回写位存储于高速缓冲存储器,将所述本地回写位发送至第二端。
应理解的是,获取本地的回写位,并将本地的回写位存储于高速缓冲存储器中,同时将本地的=回写位发送给第二端。
在高速缓冲存储器cache节点上增加位图bitmap数据结构,原本只有定义该cache数据是否为脏数据的bitmap,现对bitmap定义如下:
dirtybit,如果该数据为脏数据,该位置位。
localflushingbit,如果该数据正在本地flushing,该位置位。
peerflushingbit,如果该数据正在对端flushing,该位置位。
overwritebit,如果该数据的local/peerflushingbit在置位的情况下,该位置位。
202、所述第二端接收所述第一端的本地回写位,所述第二端将所述第一端的本地回写位记录在所述第二端的对端回写位,所述第二端创建对端回写组,将所述第二端的对端回写组的句柄发送给所述第一端。
应理解的是第二端接收第一端的本地回写位,第二端创建对端的回写组,第二端将第一端的本地回写位记录在第二端的对端回写位上,同时第二端将对端回写组的句柄发送给第一端。
可以理解的是,生成localflushingbitmap并记录在本地cache中,将localflushingbitmap发送给对端,对端收到localflushingbitmap后,将其作为peerflushingbitmap记录在本地,并在本地创建一个清空该peerflushingbitmap的计划任务,将该任务的句柄返回给flush方。
203、所述第一端接收到所述对端回写组的句柄,将所述IO锁释放。
应理解的是,第一端接收到第二端发送的对端回写组的句柄,将IO锁进行释放,flush方收到对端返回的句柄,记录在flush工作结构中,释放IO锁。注意在这里IO锁仅保护flush协商过程,而不是整个异步IO过程。
204、在所述本地回写位或所述对端回写位置为1时,且所述写数据位置为0时,所述第一端在写IO时,将所述写数据位置为1。
应理解的是,在本地回写位为1时或者对端回写位为1时,且写数据位置为0,在第一端写IO时,将写数据位置为1。
205、在所述写数据位由0置为1时,在缓存数据被替换前,所述第一端不释放已有数据,而所述第二端释放已有数据,在所述写数据位已经被置为1时,在缓存数据被替换前释放已有数据,在所述写数据位无位图结构保护时,在缓存数据替换前释放已有数据。
应理解的是,在写数据位由0置为1时,在缓存数据被替换前,第一端不释放已有数据,而第二端释放已有数据。
在写数据位已经被置为1时,在缓存数据被替换前释放已有数据。
在写数据位无位图结构保护时,在缓存数据替换前释放已有数据。
在处理写IO时,若某段数据的overwritebit已经置位,则释放已有Cache,再将新的数据填充到Cache中。
在本地回写位置为1或者对端回写位置为1时,检查所述写数据位是否置为1,在所述述写数据位置为1时,缓存数据替换前释放已有数据,第二端在缓存数据前替换已有数据;
206、在所述回写IO完成时,在所述写数据位为1时,将所述IO引用的高速缓冲存储器中的数据释放。
应理解的是,在回写IO完成时,在写数据位为1时,将IO引用的高速缓冲存储器中的数据释放。
207、将所述本地回写位置为0,并将所述写数据位置为0,获取本地回写的结果,根据所述本地回写的结果,修改所述本地的脏数据。
应理解的是,将本地回写位置为0,并将写数据位置为0,获取本地回写的结果,根据本地回写的结果,修改本地的脏数据,也就是修改dirtybit。
在处理写IO时,如果发现某段数据的local/peerflushingbit被置位,并且overwritebit未置位,则将其替换并将overwritebit置位。如果是localflushingbit置位,上述操作不会将已有的cache释放(因为有flushIO正在引用这些数据),而是将数据指针替换掉。如果是peerflushingbit被置位,则将已有cache释放即可(没有本地flushIO正在引用这些数据)。
在处理写IO时,如果发现某段数据的overwritebit已经置位,则释放已有Cache,再将新的数据填充到Cache中。
在所述写数据位由0置为1时,在缓存数据被替换前,所述第一端不释放已有数据,而所述第二端释放已有数据。
在所述写数据位已经被置为1时,在缓存数据被替换前释放已有数据。
在所述写数据位无位图结构保护时,在缓存数据替换前释放已有数据。
在flush完成之后,需要统一将本次flush对应的localflusingbit和overwritebit复位。特别的如果overwritebit在此前被置位了,需要将flushIO引用的cache数据释放掉(因为cache中的数据已经更新了)。
208、将所述本地回写的结果发送给所述第二端,所述第二端清除第二端的脏数据位和所述第二端的对端回写位。
应理解的是,将本地回写的结果发送给第二端,第二端清除第二端的脏数据位和第二端的对端回写位。
随后根据flush的结果,修改本地的dirtybitmap。
随后根据flush的结果,使用计划任务句柄通知对端修改其dirtybitmap和peerflushingbitmap。
通过本实施例提供的基于位图的双控制器的高速缓冲存储器回写方法,能够大幅度降低IO锁的持有时间,能够将回写的异步IO处理的时间从回写持有IO所的时间中移出,降低与IO处理之间的锁的冲突。
图3为本发明一实施例提供的一种基于位图的双控制器的高速缓冲存储器回写装置的结构示意图,如图3所示,本实施例提供的基于位图的双控制器的高速缓冲存储器回写装置如下所述。
基于位图的双控制器的高速缓冲存储器回写装置,包括创建模块31和写数据模块32。
创建模块31,用于建立高速缓冲存储器的位图数据结构;
写数据模块32用于根据所述位图数据结构,对所述高速缓冲存储器进行写数据;
其中,所述位图数据结构包括脏数据位,本地回写位,对端回写位和写数据位。
所述写数据模块32还用于在对所述高速缓冲存储器回写启动时,启用所述回写高速缓冲存储器的位图保护;
在对所述高速缓冲存储器回写完成时,解除所述回写高速缓冲存储器的位图保护。
所述装置还包括:
获取模块:获取高速缓冲存储器的IO锁。
所述写数据模块32,还用于获取第一端的本地回写位,将所述本地回写位存储于高速缓冲存储器,将所述本地回写位发送至第二端;
所述第二端接收所述第一端的本地回写位,所述第二端将所述第一端的本地回写位记录在所述第二端的对端回写位,所述第二端创建对端回写组,将所述第二端的对端回写组的句柄发送给所述第一端;
所述第一端接收到所述对端回写组的句柄,将所述IO锁释放。
所述写数据模块32,还用于在所述本地回写位或所述对端回写位置为1时,且所述写数据位置为0时,所述第一端在写IO时,将所述写数据位置为1;
在所述写数据位由0置为1时,在缓存数据被替换前,所述第一端不释放已有数据,而所述第二端释放已有数据,在所述写数据位已经被置为1时,在缓存数据被替换前释放已有数据,在所述写数据位无位图结构保护时,在缓存数据替换前释放已有数据。
在所述回写IO完成时,在所述写数据位为1时,将所述IO引用的高速缓冲存储器中的数据释放;
将所述本地回写位置为0,并将所述写数据位置为0,获取本地回写的结果,根据所述本地回写的结果,修改所述本地的脏数据位;
将所述本地回写的结果发送给所述第二端,所述第二端清除第二端的脏数据位和所述第二端的对端回写位。
通过本实施例提供的基于位图的双控制器的高速缓冲存储器回写装置,能够大幅度降低IO锁的持有时间,能够将回写的异步IO处理的时间从回写持有IO所的时间中移出,降低与IO处理之间的锁的冲突。
本领域普通技术人员可以理解:实现上述方法实施例的全部或者部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储在计算机可读取的存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质中。
以上所述,仅为本发明的具体实施方式,但是,本发明的保护范围不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替代,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述权利要求的保护范围为准。