基于双控制器的读写锁方法及装置与流程

文档序号:13251922阅读:150来源:国知局
技术领域本发明涉及磁盘数据读写技术领域,特别涉及一种基于双控制器的读写锁方法及装置。

背景技术:
在双控存储服务器中,可以将数个磁盘做成磁盘阵列(RedundantArraysofindependentDisks,RAID)卷组,从而提供高速、安全的数据存储服务。大部分RAID级别(例如RAID5)都需要将磁盘进行条带化管理,而对于一个条带的读写访问必须互斥,否则就会发生数据错误。例如Linux自带的开源RAID使用的是本地条带锁,但它不能满足双控制器对于RAID条带互斥的需求。并且在数据Cache层面,也必须要有对应的双控锁来控制对双控缓存(Cache)的读取与修改的互斥。综上所述,在实际业务上需要的是一种双控的区间锁,可以对某一I/O范围或者条带范围进行锁定。并且,在对端控制器因异常下线的时候,本控制器的双控范围锁需要处理这样的异常以保证没有拿锁者进入无限等待状态。要实现双控锁,必须依赖于双控通讯机制。在这里不讨论双控通讯的实现细节,仅假设存在这样的通讯机制:能够发送数据,能接收并处理数据,并在对端上线或下线时进行事件通知。简单的方案是将整个存储地址空间(即所属的RAID卷组的存储空间)划分成固定的数据块Block(例如64K个单位),在两个控制器上保存这些Block的“所有者”信息(属于本地还是对端),如果在拿锁时该范围属于本地Block,则在本地Block上进行拿锁,否则向对端索要整个Block的所有权,在拿到所有权之后继续在Block上进行拿锁。如果是读锁,实际上并不存在冲突,但必须等待对端完全读完才能释放Block的所有权,进而拿到Block的所有权,进而拿到锁,整个时间较长;虽然某个Block范围属于对端,但对端持有的范围与本地想要拿锁的范围实际上并不存在冲突;Block大小固定,不能随着不同的RAID级别灵活调整;对于未创建的Block,在第一次拿锁时必然产生一次通讯,如果某个控制器并不实际参与io操作(例如未接光纤或光纤断开等情况),可能会产生很多不必要的通讯。

技术实现要素:
为了提出一种既能够减少通讯,又能更加精确的处理锁冲突的基于双控制器的读写锁方法及装置;本发明提供了一种基于双控制器的读写锁方法,所述方法包括:S1:将整个存储地址空间分割为M个区间块,并将所述M个区间块划分为等长的N个区间,所述N和M均为不小于1的整数;S2:在每个区间块上存放一个红黑树的根节点,所述根节点用于保存Area节点,所述Area节点记录对应区域块的存储地址空间;S3:在需要对目标读写区间进行锁定时,确定所述目标读写区间所属的区间块,在所确定到的区间块的红黑树上查找该区间块所属的Area节点,并在查找到的Area节点的红黑树上查找目标读写区间,若未找到所述目标读写区间,则创建所述目标读写区间对应的Block节点,并将创建的Block节点插入到该Area节点所属的红黑树中;S4:在所述Block节点下创建SubLock节点,查找所述SubLock节点中存储地址空间冲突的节点,若所述存储地址空间冲突的节点存在读写冲突,则增加所述SubLock节点的冲突计数,每个SubLock节点代表一个保存存储地址空间的子锁;S5:判断所述冲突计数是否为初始值,若是,则完成对所述目标读写区间的锁定。其中,步骤S5中,若否,则等待所述目标读写区间被释放资源后,再对所述目标读写区间进行锁定。其中,所述目标读写区间被释放资源,具体包括:查找所述目标读写区间的SubLock节点中存储地址空间冲突的节点X,对每一个存在存储地址空间冲突和读写冲突的节点X,减少该节点X的冲突计数,若该节点X的冲突计数降到初始值,则完成该节点X对应的目标读写区间的锁定。其中,步骤S2中,还包括:将每个区间分配给控制器,所述Area节点还记录有控制器标识;当向属于对端控制器的目标读写区间进行锁定时,相应地,步骤S5中,对所述目标读写区间进行锁定之前,还包括:向所述对端控制器发送转让请求,所述对端控制器在收到转让请求后,转让所述目标读写区间的所有权;转让完成后直接对所述目标读写区间进行锁定;如果不能立即转让,则在本地释放资源之后,进行第二次目标读写区间所有权转让;如果仍然不能转让,则放弃转让,直接对所述目标读写区间进行锁定。其中,步骤S2中,将每个区间分配给控制器,具体包括:在区间上产生的第一个锁定请求时,会与对端控制器进行一次通讯,与对端控制器协商该区间的所有权,如果对方未持有该区间的所有权,则本端控制器获得该区间的所有权;否则本端控制器得知对端对该控制器的所有权;当双方同时发起对区间的所有权协商时,则使用随机数+控制器插槽号的方式决定优先级,优先级高的控制器获得该区间的所有权。本发明还公开了一种基于双控制器的读写锁装置,所述装置包括:初始化模块,用于将整个存储地址空间分割为M个区间块,并将所述M个区间块划分为等长的N个区间,所述N和M均为不小于1的整数;节点生成模块,用于在每个区间块上存放一个红黑树的根节点,所述根节点用于保存Area节点,所述Area节点记录对应区域块的存储地址空间;区间查找模块,用于在需要对目标读写区间进行锁定时,确定所述目标读写区间所属的区间块,在所确定到的区间块的红黑树上查找该区间块所属的Area节点,并在查找到的Area节点的红黑树上查找目标读写区间,若未找到所述目标读写区间,则创建所述目标读写区间对应的Block节点,并将创建的Block节点插入到该Area节点所属的红黑树中;空间冲突模块,用于在所述Block节点下创建SubLock节点,查找所述SubLock节点中存储地址空间冲突的节点,若所述存储地址空间冲突的节点存在读写冲突,则增加所述SubLock节点的冲突计数,每个SubLock节点代表一个保存存储地址空间的子锁;判断锁定模块,用于判断所述冲突计数是否为初始值,若是,则完成对所述目标读写区间的锁定。其中,所述判断锁定模块,还用于若否,则等待所述目标读写区间被释放资源后,再对所述目标读写区间进行锁定。其中,所述判断锁定模块,还用于查找所述目标读写区间的SubLock节点中存储地址空间冲突的节点X,对每一个存在存储地址空间冲突和读写冲突的节点X,减少该节点X的冲突计数,若该节点X的冲突计数降到初始值,则完成该节点X对应的目标读写区间的锁定。其中,所述节点生成模块,还用于将每个区间分配给控制器,所述Area节点还记录有控制器标识;所述装置还包括:所有权转让模块,用于向所述对端控制器发送转让请求,所述对端控制器在收到转让请求后,转让所述目标读写区间的所有权;转让完成后直接对所述目标读写区间进行锁定;如果不能立即转让,则在本地释放资源之后,进行第二次目标读写区间所有权转让;如果仍然不能转让,则放弃转让,直接对所述目标读写区间进行锁定。其中,所述节点生成模块,还用于在区间上产生的第一个锁定请求时,会与对端控制器进行一次通讯,与对端控制器协商该区间的所有权,如果对方未持有该区间的所有权,则本端控制器获得该区间的所有权;否则本端控制器得知对端对该控制器的所有权;当双方同时发起对区间的所有权协商时,则使用随机数+控制器插槽号的方式决定优先级,优先级高的控制器获得该区间的所有权。本发明通过各步骤间的配合,从而既能够减少了通讯,又能更加精确的处理锁冲突。附图说明图1是本发明一种实施方式的基于双控制器的读写锁方法的流程图;图2是本发明一种实施方式的基于双控制器的读写锁装置的结构框图。具体实施方式下面结合附图和实施例,对本发明的具体实施方式作进一步详细描述。以下实施例用于说明本发明,但不用来限制本发明的范围。图1是本发明一种实施方式的基于双控制器的读写锁方法的流程图;参照图1,所述方法包括:S1:将整个存储地址空间分割为M个区间块,并将所述M个区间块划分为等长的N个区间,所述N和M均为不小于1的整数;S2:在每个区间块上存放一个红黑树的根节点,所述根节点用于保存Area节点,所述Area节点记录对应区域块的存储地址空间;S3:在需要对目标读写区间进行锁定时,确定所述目标读写区间所属的区间块,在所确定到的区间块的红黑树上查找该区间块所属的Area节点,并在查找到的Area节点的红黑树上查找目标读写区间,若未找到所述目标读写区间,则创建所述目标读写区间对应的Block节点,并将创建的Block节点插入到该Area节点所属的红黑树中;S4:在所述Block节点下创建SubLock节点,查找所述SubLock节点中存储地址空间冲突的节点,若所述存储地址空间冲突的节点存在读写冲突,则增加所述SubLock节点的冲突计数,每个SubLock节点代表一个保存存储地址空间的子锁;S5:判断所述冲突计数是否为初始值,若是,则完成对所述目标读写区间的锁定。可选地,步骤S5中,若否,则等待所述目标读写区间被释放资源后,再对所述目标读写区间进行锁定。可选地,所述目标读写区间被释放资源,具体包括:查找所述目标读写区间的SubLock节点中存储地址空间冲突的节点X,对每一个存在存储地址空间冲突和读写冲突的节点X,减少该节点X的冲突计数,若该节点X的冲突计数降到初始值,则完成该节点X对应的目标读写区间的锁定。可选地,步骤S2中,还包括:将每个区间分配给控制器,所述Area节点还记录有控制器标识;当向属于对端控制器的目标读写区间进行锁定时,相应地,步骤S5中,对所述目标读写区间进行锁定之前,还包括:向所述对端控制器发送转让请求,所述对端控制器在收到转让请求后,转让所述目标读写区间的所有权;转让完成后直接对所述目标读写区间进行锁定;如果不能立即转让,则在本地释放资源之后,进行第二次目标读写区间所有权转让;如果仍然不能转让,则放弃转让,直接对所述目标读写区间进行锁定。可选地,步骤S2中,将每个区间分配给控制器,具体包括:在区间上产生的第一个锁定请求时,会与对端控制器进行一次通讯,与对端控制器协商该区间的所有权,如果对方未持有该区间的所有权,则本端控制器获得该区间的所有权;否则本端控制器得知对端对该控制器的所有权;当双方同时发起对区间的所有权协商时,则使用随机数+控制器插槽号的方式决定优先级,优先级高的控制器获得该区间的所有权。本发明还公开了一种基于双控制器的读写锁装置,参照图2,所述装置包括:初始化模块,用于将整个存储地址空间分割为M个区间块,并将所述M个区间块划分为等长的N个区间,所述N和M均为不小于1的整数;节点生成模块,用于在每个区间块上存放一个红黑树的根节点,所述根节点用于保存Area节点,所述Area节点记录对应区域块的存储地址空间;区间查找模块,用于在需要对目标读写区间进行锁定时,确定所述目标读写区间所属的区间块,在所确定到的区间块的红黑树上查找该区间块所属的Area节点,并在查找到的Area节点的红黑树上查找目标读写区间,若未找到所述目标读写区间,则创建所述目标读写区间对应的Block节点,并将创建的Block节点插入到该Area节点所属的红黑树中;空间冲突模块,用于在所述Block节点下创建SubLock节点,查找所述SubLock节点中存储地址空间冲突的节点,若所述存储地址空间冲突的节点存在读写冲突,则增加所述SubLock节点的冲突计数,每个SubLock节点代表一个保存存储地址空间的子锁;判断锁定模块,用于判断所述冲突计数是否为初始值,若是,则完成对所述目标读写区间的锁定。可选地,所述判断锁定模块,还用于若否,则等待所述目标读写区间被释放资源后,再对所述目标读写区间进行锁定。可选地,所述判断锁定模块,还用于查找所述目标读写区间的SubLock节点中存储地址空间冲突的节点X,对每一个存在存储地址空间冲突和读写冲突的节点X,减少该节点X的冲突计数,若该节点X的冲突计数降到初始值,则完成该节点X对应的目标读写区间的锁定。可选地,所述节点生成模块,还用于将每个区间分配给控制器,所述Area节点还记录有控制器标识;所述装置还包括:所有权转让模块,用于向所述对端控制器发送转让请求,所述对端控制器在收到转让请求后,转让所述目标读写区间的所有权;转让完成后直接对所述目标读写区间进行锁定;如果不能立即转让,则在本地释放资源之后,进行第二次目标读写区间所有权转让;如果仍然不能转让,则放弃转让,直接对所述目标读写区间进行锁定。可选地,所述节点生成模块,还用于在区间上产生的第一个锁定请求时,会与对端控制器进行一次通讯,与对端控制器协商该区间的所有权,如果对方未持有该区间的所有权,则本端控制器获得该区间的所有权;否则本端控制器得知对端对该控制器的所有权;当双方同时发起对区间的所有权协商时,则使用随机数+控制器插槽号的方式决定优先级,优先级高的控制器获得该区间的所有权。实施例下面以一个具体的实施例来说明本发明,但不限定本发明的保护范围。本实施例的方法包括:(1).将整个存储地址空间划分为M个区间,区间大小可以在创建锁的时候进行制定,例如可以将其指定为一个条带的大小(这是一个优化参数)。区间为所有权划分的最小单元。(2).将整个存储地址空间划分为数个等长的区间块,例如将128TB的存储地址空间按照128GB分为1024个区间块,其目的是将区间块的范围缩小,加快区间块上的查找速度,这一步可以看作是一次简单Hash。区间块的大小是区间大小的整数倍(最后一个区间块除外)。(3).每个区间块上存放一个红黑树的根节点,在区间块上产生的第一个拿锁(即对目标读写区域进行锁定)请求会进行一次通讯,与对端协商该目标读写区域的所有权,如果对方未持有该目标读写区域,则本端获得该目标读写区域;否则本端得知对端对该目标读写区域的所有权;特别的,当双方同时发起对某目标读写区域的所有权协商时(冲突发生),使用随机数+控制器插槽号的方式决定优先级。协商完成后,会在双端区间块的红黑树上生成一个节点,称之为Area节点,上面记录了整个区间块的存储地址空间,及控制器标识。(4).在需要对目标读写区间进行锁定时,确定所述目标读写区间所属的区间块,在所确定到的区间块的红黑树上查找该区间块所属的Area节点,并在查找到的Area节点的红黑树上查找目标读写区间,若未找到所述目标读写区间,则创建所述目标读写区间对应的Block节点,并将创建的Block节点插入到该Area节点所属的红黑树中。(5).在Block节点下面是一个基于红黑树的范围树,其节点称之为SubLock节点(子锁)。首先创建SubLock节点,然后在Block节点中查找范围冲突的SubLock节点,对找到的范围冲突节点判断是否存在读写冲突。如存在,则增加该SubLock节点的冲突计数。在查找结束后,如果该SubLock节点的冲突计数为0,则该SubLock节点拿到了锁,调用对应的拿锁回调函数。冲突计数在这里起到了两个作用:冲突检测、拿锁顺序保证。(6).在放锁(即释放资源)的时候进行与步骤5同样冲突检测,并减小该SubLock节点的冲突计数,如果某个SubLock节点的冲突计数降到0,则其拿到了锁,调用对应的拿锁回调函数。(7).特别的,当试图在属于对端的Area节点上进行拿锁时,使用同样的步骤进行拿锁,在拿到本地的锁之后,再向对端发起拿锁请求。对端在收到请求之后,会尝试转让目标读写区间的归属权,如果不能立即转让(对端在该Block节点上还有未释放的SubLock节点),则在对端重复本地拿锁流程。在拿锁完成后进行第二次Block节点归属权转让的尝试,如果仍然不能转让,则放弃转让,对拿锁请求进行响应。本端在收到响应之后,完成整个拿锁动作。(8).在释放属于对端的锁时,也通知对端该锁已经释放。(9).在处理对端断开事件时,使用链表遍历所有属于对端的锁进行放锁,再遍历所有的Area节点,将属于对端的Area节点转换为属于本地的Area节点即可。以上实施方式仅用于说明本发明,而并非对本发明的限制,有关技术领域的普通技术人员,在不脱离本发明的精神和范围的情况下,还可以做出各种变化和变型,因此所有等同的技术方案也属于本发明的范畴,本发明的专利保护范围应由权利要求限定。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1