一种死锁检测方法、设备及系统的制作方法

文档序号:6521590阅读:187来源:国知局
一种死锁检测方法、设备及系统的制作方法
【专利摘要】本发明公开了一种死锁检测方法、设备及系统,属于集群【技术领域】。所述方法包括:接收第一线程客户设备对第一锁的申请;根据所述申请向集群锁管理器发送授权请求,申请所述第一锁的授权;接收到所述集群锁管理器返回的等待消息;查询本地的锁申请实时记录,若发现所述第一线程客户设备持有第二锁,则在集群内发起所述第一锁的依赖路径回溯查找;根据所述依赖路径回溯查找的结果判定是否形成死锁。本发明在线程客户设备申请某个锁被挂起时,由代理服务器查找该线程客户设备是否已经持有另一个锁,并在发现该线程客户设备已持有另一锁时,发起该线程客户设备申请的锁的依赖路径回溯查找,不仅实现了对死锁的实时检测,而且方法简单高效。
【专利说明】一种死锁检测方法、设备及系统
【技术领域】
[0001]本发明涉及集群【技术领域】,特别涉及一种死锁检测方法、设备及系统。
【背景技术】
[0002]集群是一种对外表现为具有高可用性、高性能和易管理性的单一、统一的计算资源。在对集群性能的追求过程中,分布式集群应运而生。为保障集群的一致性,集群锁必不可少。在二级授权分布式锁的实现中有三个实体:集群Master (锁管理器)、本地Proxy (代理服务器)、线程客户设备。以η节点的集群为例,每个节点均有一个Proxy(即本地Proxy);线程客户设备是锁的申请者,以Tread (线程)号为标识,可以向本节点的Proxy申请多个锁;Master负责集群内各锁的分发授权,仲裁不同节点Proxy的锁申请,将锁授权给合适的某个集群节点Proxy,并对上述授权信息进行管理;本地Proxy负责代理、收集本节点内所有线程客户设备的锁申请,并向Master发送申请,获得Master授权的本地Proxy可以再向合适的客户进行二次授权。如果线程客户设备(Thread)持有一个锁(即已经得到了一个锁的授权),当其申请另一个锁得不到授权被挂起时,就形成了依赖路径,如果此依赖路径环回到发起节点,则形成闭环,即形成死锁,如图1所示。在分布式集群领域,死锁是非常致命的问题,因此在如何实现在分布式死锁检测便显得十分重要。
[0003]现有技术的死锁检测方法通常采用超时法对集群内的进程进行检测,即当某个线程客户设备等待的时间超过规定时间,就认为发生了死锁。
[0004]在实现本发明的过程中,发明人发现现有技术至少存在以下问题:
[0005]现有技术的死锁检测方法实时性差,不适用于分布集群环境。

【发明内容】

[0006]本发明实施例提供了一种死锁检测方法、设备及系统,可以检测死锁。
[0007]第一方面,提供了一种死锁检测方法,用于代理服务器,所述代理服务器与集群锁管理器及第一线程客户设备之间分别建立通信联系,所述方法包括:接收第一线程客户设备对第一锁的申请;根据所述申请向集群锁管理器发送授权请求,申请所述第一锁的授权;接收到所述集群锁管理器返回的等待消息;查询本地的锁申请实时记录,若查询到所述第一线程客户设备持有第二锁,则在集群内发起所述第一锁的依赖路径回溯查找;根据所述依赖路径回溯查找的结果判定是否形成死锁。
[0008]结合第一方面,在第一方面的第一种可能的实现方式中,所述查询本地的锁申请实时记录,包括:根据所述第一线程客户设备的线程身份标识号码ID在所述锁申请实时记录中查询所述第一线程客户设备是否持有所述第二锁。
[0009]结合第一方面的第一种可能的实现方式,在第一方面的第二种可能的实现方式中,所述在集群内发起所述第一锁的依赖路径回溯查找,包括:查找所述第一锁是否有依赖路径;若所述第一锁无依赖路径,或者所述第一锁有依赖路径且所述依赖路径中的依赖锁为所述第二锁,则结束所述依赖路径回溯查找;若所述第一锁有依赖路径,且所述依赖路径中的依赖锁不是所述第二锁,则进行所述依赖锁的依赖路径回溯查找。
[0010]结合第一方面的第二种可能的实现方式,在第一方面的第三种可能的实现方式中,所述查找所述第一锁是否有依赖路径,包括:向所述集群锁管理器查询所述第一锁的授权代理服务器;接收所述集群锁管理器返回的所述授权代理服务器的相关信息;根据所述相关信息向所述授权代理服务器查询所述第一锁是否有授权线程客户设备以及所述授权线程客户设备是否正在申请另一个锁;接收所述授权代理服务器反馈的查询结果;根据所述查询结果判断所述第一锁是否有依赖路径:若所述第一锁有授权线程客户设备且所述授权线程客户设备正在申请另一个锁,则判定所述第一锁有依赖路径,否则判定所述第一锁无依赖路径。
[0011]结合第一方面的第三种可能的实现方式,在第一方面的第四种可能的实现方式中,所述根据所述相关信息向所述授权代理服务器查询所述第一锁是否有授权线程客户设备以及所述授权线程客户设备是否正在申请另一个锁之后,还包括:所述授权代理服务器接收携带所述第一锁的相关信息的查询请求;所述授权代理服务器根据所述查询请求携带的所述第一锁的相关信息在其锁申请实时记录中查找所述第一锁的授权线程客户;所述授权代理服务器根据所述授权线程客户设备的线程ID在其锁申请实时记录中查询所述授权线程客户是否正在申请另一锁;所述授权代理服务器将查询结果进行反馈。
[0012]结合第一方面的第二种至第四种任一种可能的实现方式,在第一方面的第五种可能的实现方式中,所述根据所述依赖路径回溯查找的结果判定是否形成了死锁,包括:根据所述依赖路径回溯查找结束的原因判断是否形成了死锁:若所述依赖路径回溯查找结束的原因包括:所述第一锁或某个依赖锁无依赖路径,则判定未形成死锁;若所述依赖路径回溯查找结束的原因包括:所述第一锁或某个依赖锁有依赖路径,且所述依赖路径中的依赖锁为所述第二锁,则判定形成死锁。
[0013]结合第一方面,在第一方面的第六种可能的实现方式中,如果根据所述依赖路径回溯查找的结果判定形成死锁,则驳回所述第一线程客户设备对第一锁的授权申请;通知所述第一线程客户设备释放对所述第二锁的占用。
[0014]第二方面,提供一种代理服务器,包括:接收单元,用于接收第一线程客户设备对第一锁的申请;发送单元,用于根据所述接收单元接收的申请向集群锁管理器发送授权请求,申请所述第一锁的授权;所述接收单元,还用于在所述发送单元向集群锁管理器发送授权请求之后,接收所述集群锁管理器返回的等待消息;回溯查找单元,用于在所述接收单元收到所述等待消息之后,查询本地的锁申请实时记录,若查询到所述第一线程客户设备持有第二锁,则在集群内发起所述第一锁的依赖路径回溯查找;死锁判定单元,用于根据所述回溯查找单元的查找结果判定是否形成了死锁。
[0015]结合第二方面,在第二方面的第一种可能的实现方式中,还包括:存储单元,用于存储本地线程客户设备的锁申请实时记录;所述回溯查找单元用于,根据所述第一线程客户设备的线程身份标识号码ID,在所述存储单元中存储的锁申请实时记录中查询所述线程客户设备是否持有所述第二锁。
[0016]结合第二方面的第一种可能的实现方式,在第二方面的第二种可能的实现方式中,所述回溯查找单元包括:查询模块,用于在所述接收单元收到所述等待消息之后,查询所述存储单元存储的锁申请实时记录;依赖查找模块,用于在所述查询模块查找到所述第一线程客户设备持有所述第二锁时,查找第一锁是否有依赖路径;若所述第一锁无依赖路径,或者所述第一锁有依赖路径且所述依赖路径中的依赖锁为所述第二锁,则结束所述依赖路径回溯查找;若所述第一锁有依赖路径,且所述依赖路径中的依赖锁不是所述第二锁,则进行所述依赖锁的依赖路径回溯查找。
[0017]结合第二方面的第二种可能的实现方式,在第二方面的第三种可能的实现方式中,所述依赖查找模块包括:获取子模块,用于向所述集群锁管理器查询所述第一锁的授权代理服务器,接收所述集群锁管理器返回的所述授权代理服务器的相关信息;查询子模块,还用于根据所述获取子模块接收的所述相关信息,向所述授权代理服务器查询所述第一锁是否有授权线程客户设备以及所述授权线程客户设备是否正在申请另一个锁,并接收所述授权代理服务器反馈的查询结果;依赖路径确定子模块,用于根据所述查询子模块接收的查询结果判断所述第一锁是否有依赖路径:若所述第一锁有授权线程客户设备且所述授权线程客户设备正在申请另一个锁,则判定所述第一锁有依赖路径,否则判定所述第一锁无依赖路径。
[0018]结合第二方面的第二种或第三种可能的实现方式,在第二方面的第四种可能的实现方式中,所述死锁判定单元用于,在所述依赖查找模块结束所述依赖路径回溯查找之后,根据所述依赖路径回溯查找结束的原因判断是否形成了死锁:若所述依赖路径回溯查找结束的原因包括:所述第一锁或某个依赖锁无依赖路径,则判定未形成死锁;若所述依赖路径回溯查找结束的原因包括:所述第一锁或某个依赖锁有依赖路径,且所述依赖路径中的依赖锁为所述第二锁,则判定形成死锁。
[0019]结合第二方面的第第四种可能的实现方式,在第二方面的第五种可能的实现方式中,所述代理服务器还包括:死锁处理单元,用于在所述死锁判定单元判定形成死锁后驳回所述第一线程客户设备对第一锁的授权申请,并通知第一线程客户设备释放对第二锁的占用。
[0020]结合第二方面的第五种可能的实现方式,在第二方面的第六种可能的实现方式中,所述接收单元,还用于接收另一代理服务器发送的查询请求,所述查询请求携带需查询的锁的相关信息;所述回溯查找单元,还用于在所述接收单元接收到所述查询请求后,根据所述锁的相关信息,在所述存储单元存储的锁申请实时记录中查找所述锁的授权线程客户设备;以及用于根据所述授权线程客户设备的线程ID在所述本地锁申请实时记录中查询所述授权线程客户设备是否正在申请另一锁;所述发送单元,还用于将所述回溯查找单元的查找结果发送给所述另一代理服务器。
[0021]第三方面,提供一种代理服务器,包括:接收机,用于接收第一线程客户设备对第一锁的申请;发送机,用于根据所述接收机接收的申请向集群锁管理器发送授权请求,申请所述第一锁的授权;所述接收机,还用于在所述发送单元向集群锁管理器发送授权请求之后,接收所述集群锁管理器返回的等待消息;处理器,用于在所述接收机收到所述等待消息之后,查询本地的锁申请实时记录,若查询到所述第一线程客户设备持有第二锁,则在集群内发起所述第一锁的依赖路径回溯查找;以及用于根据所述回溯查找单元的查找结果判定是否形成了死锁。
[0022]结合第三方面,在第三方面的第一种可能的实现方式中,所述存储器,用于存储本地线程客户设备的锁申请实时记录;所述处理器用于,根据所述第一线程客户设备的线程身份标识号码ID,在所述存储器存储的锁申请实时记录中,查询所述线程客户设备是否持有所述第二锁。
[0023]结合第三方面的第一种可能的实现方式,在第三方面的第二种可能的实现方式中,所述处理器用于,在查找到所述第一线程客户设备持有所述第二锁时,查找所述第一锁是否有依赖路径;以及用于根据所述依赖路径查找的结果判断是否结束所述依赖路径回溯查找:若所述第一锁无依赖路径,或者所述第一锁有依赖路径且所述依赖路径中的依赖锁为所述第二锁,则结束所述依赖路径回溯查找;若所述第一锁有依赖路径,且所述依赖路径中的依赖锁不是所述第二锁,则进行所述依赖锁的依赖路径回溯查找。
[0024]结合第三方面的第二种可能的实现方式,在第三方面的第三种可能的实现方式中,所述发送机,还用于在查找所述第一锁是否有依赖路径时,向所述集群锁管理器查询所述第一锁的授权代理服务器;所述接收机,还用于接收所述集群锁管理器返回的所述授权代理服务器的相关信息;所述发送机,还用于根据所述接收机接收的所述相关信息向所述授权代理服务器查询所述第一锁是否有授权线程客户设备以及所述授权线程客户设备是否正在申请另一个锁;所述接收机,还用于接收所述授权代理服务器反馈的查询结果;所述处理器,还用于根据所述接收机接收的查询结果判断所述第一锁是否有依赖路径:若所述第一锁有授权线程客户设备且所述授权线程客户设备正在申请另一个锁,则判定所述第一锁有依赖路径,否则判定所述第一锁无依赖路径。
[0025]结合第三方面的第二种或第三种可能的实现方式,在第三方面的第四种可能的实现方式中,所述处理器,还用于根据所述依赖路径回溯的查找结果判断是否形成了死锁:若所述依赖路径回溯查找结束的原因包括:所述第一锁或某个依赖锁无依赖路径,则判定未形成死锁;若所述依赖路径回溯查找结束的原因包括:所述第一锁或某个依赖锁有依赖路径,且所述依赖路径中的依赖锁为所述第二锁,则判定形成死锁。
[0026]结合第三方面的第第四种可能的实现方式,在第三方面的第五种可能的实现方式中,所述发送机,还用于在所述处理器判定形成死锁后驳回所述第一线程客户设备对第一锁的授权申请,并通知第一线程客户设备释放对第二锁的占用。
[0027]结合第三方面的第五种可能的实现方式,在第三方面的第六种可能的实现方式中,所述接收机,还用于接收另一代理服务器发送的查询请求,所述查询请求携带需查询的锁的相关信息;所述处理器,还用于在所述接收机接收到所述查询请求后,根据所述锁的相关信息,在所述锁申请实时记录中查找所述查询请求中的锁的授权线程客户设备;以及用于根据所述授权线程客户设备的线程ID在所述本地锁申请实时记录中查询所述授权线程客户设备是否正在申请另一锁;所述发送机,还用于将所述处理器的查找结果发送给所述另一代理服务器。
[0028]第四方面,提供一种死锁检测系统,包括:所述第一线程客户设备,用于向所述第一代理服务器发送对第一锁的申请;第一代理服务器,包括如第二方面任一种可能的实现方式所述的代理服务器,用于接收所述第一线程客户设备对第一锁的申请,根据所述申请向集群锁管理器发送授权请求,申请所述第一锁的授权,接收所述集群锁管理器返回的等待消息,查询本地的锁申请实时记录,若查询到所述第一线程客户设备持有第二锁,则在集群内发起所述第一锁的依赖路径回溯查找,根据所述依赖路径回溯查找的结果判定是否形成了死锁;集群锁管理器,用于接收所述第一代理服务器发送的所述授权请求,向所述第一代理服务器返回授权或等待消息。
[0029]结合第四方面,在第四方面的第一种可能的实现方式中,所述第一代理服务器用于,向所述集群锁管理器查询所述第一锁的授权代理服务器,接收所述集群锁管理器返回的所述授权代理服务器的相关信息,根据所述相关信息向所述授权代理服务器查询所述第一锁是否有授权线程客户设备以及所述授权线程客户设备是否正在申请另一个锁,接收所述授权代理服务器反馈的查询结果,根据所述查询结果判断所述第一锁是否有依赖路径:若所述第一锁有授权线程客户设备且所述授权线程客户设备正在申请另一个锁,则判定所述第一锁有依赖路径,否则判定所述第一锁无依赖路径;所述集群锁管理器还用于,当所述第一代理服务器查询所述第一锁的授权代理服务器时,返回所述授权代理服务器的相关信息给所述第一代理服务器;所述系统还包括:授权代理服务器,包括如第二方面任一种可能的实现方式所述的代理服务器,用于当所述第一代理服务器查询所述第一锁是否有授权线程客户设备以及所述授权线程客户设备是否正在申请另一个锁时,返回查询结果给所述第一代理服务器。
[0030]本发明实施例提供的技术方案,可以通过利用各节点的代理服务器Proxy的锁申请实时记录,在线程客户设备申请第一锁的授权,而收到等待消息时,该线程客户设备所在节点的Proxy便在锁申请实时记录中查找该线程客户设备是否已经持有第二个锁,当发现该线程客户设备已经持有第二锁时,及时发起该线程客户设备申请的锁的依赖路径回溯查找,然后根据依赖路径回溯查找的结果来判定是否形成了死锁,从而能够及时的发现死锁,以便及时进行解除死锁的处理,不仅实现了对死锁的实时检测,而且方法简单高效。
【专利附图】

【附图说明】
[0031]为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
[0032]图1是现有技术中形成死锁的示意图;
[0033]图2是本发明实施例一提供的死锁检测的方法流程图;
[0034]图3是本发明实施例二提供的死锁检测的方法流程图;
[0035]图4是本发明实施例二的方法中查询锁a的依赖路径的流程图;
[0036]图5是本发明实施例二的方法中一种形成死锁的情况示意图;
[0037]图6是本发明实施例三提供的死锁检测的方法流程图示意图;
[0038]图7是本发明实施例四提供的代理服务器的结构示意图;
[0039]图8是本发明实施例五提供的代理服务器的结构示意图;
[0040]图9是本发明实施例五提供的死锁检测系统的结构示意图。
【具体实施方式】
[0041]为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进一步地详细描述。
[0042]首先对本发明实施例涉及的术语进行说明。[0043]本发明实施例中涉及的锁相当于对某个数据或资源的独占权,每一个线程客户设备在访问该数据或资源之前首先试图获取锁(即申请锁),在访问结束之后释放锁;如果在申请锁的时候,该锁已经被其他线程客户设备占用,线程客户设备会等待,直到该锁被释放。通过锁可以对集群内的共享资源或者逻辑对象进行保护。例如对文件、目录的并发访问;或者两个以上的进程(或线程),对同一个文件进行写访问时,通过锁的应用,使得同一时刻仅有一个进程拥有写访问的权限,可以避免两个进程同时访问这个文件造成的数据混舌L。
[0044]在一个集群环境中,若线程客户设备Tl持有锁X,申请锁a被阻塞,对其它线程客户设备而言,当前如果要申请锁X,就要等到线程客户设备Tl对锁a的申请得到回应。这种情况下,路径(Tl,锁a)为锁X的依赖路径,Tl为依赖路径中的授权线程客户设备,锁a为依赖路径中的依赖锁。
[0045]具体的,锁a的依赖路径回溯查找,是指本地Proxy在集群内查询锁a的依赖路径,以及在锁a有依赖路径时查询该依赖路径中的依赖锁的依赖路径的过程,因此在依赖路径回溯查找的过程中,只要未达到结束依赖路径回溯查找的条件,该动作就会持续下去。
[0046]实施例一
[0047]本发明实施例提供了一种死锁检测方法,用于代理服务器,所述代理服务器与集群锁管理器及第一线程客户设备之间分别建立通信连接,参见图2,方法流程包括:
[0048]201、接收第一线程客户设备对第一锁的申请;
[0049]202、根据所述申请向集群锁管理器发送授权请求,申请所述第一锁的授权;
[0050]203、接收所述集群锁管理器返回的等待消息;
[0051]204、查询本地的锁申请实时记录,若查询到所述第一线程客户设备持有第二锁,则在集群内发起所述第一锁的依赖路径回溯查找;
[0052]205、根据所述依赖路径回溯查找的结果判定是否形成死锁。
[0053]进一步的,所述查询本地的锁申请实时记录,包括:
[0054]根据所述第一线程客户设备的线程身份标识号码ID在所述锁申请实时记录中查询所述第一线程客户设备是否持有所述第二锁。
[0055]进一步的,所述在集群内发起所述第一锁的依赖路径回溯查找,包括:
[0056]查找所述第一锁是否有依赖路径;
[0057]根据所述依赖路径查找的结果判断是否结束所述依赖路径回溯查找:
[0058]若所述第一锁无依赖路径,或者所述第一锁有依赖路径且所述依赖路径中的依赖锁为所述第二锁,则结束所述依赖路径回溯查找;
[0059]若所述第一锁有依赖路径,且所述依赖路径中的依赖锁不是所述第二锁,则进行所述依赖锁的依赖路径回溯查找。
[0060]进一步的,所述查找所述第一锁是否有依赖路径,包括:
[0061]向所述集群锁管理器查询所述第一锁的授权代理服务器;
[0062]收到所述集群锁管理器返回的所述授权代理服务器的相关信息;
[0063]根据所述相关信息向所述授权代理服务器查询所述第一锁是否有授权线程客户设备以及所述授权线程客户设备是否正在申请另一个锁;
[0064]接收所述授权代理服务器反馈的查询结果;[0065]根据所述查询结果判断所述第一锁是否有依赖路径:若所述第一锁有授权线程客户设备且所述授权线程客户设备正在申请另一个锁,则判定所述第一锁有依赖路径,否则判定所述第一锁无依赖路径。
[0066]进一步的,所述根据所述相关信息向所述授权代理服务器查询所述第一锁是否有授权线程客户设备以及所述授权线程客户设备是否正在申请另一个锁之后,还包括:
[0067]所述授权代理服务器接收携带所述第一锁的相关信息的查询请求;
[0068]所述授权代理服务器根据所述查询请求携带的所述第一锁的相关信息在其锁申请实时记录中查找所述第一锁的授权线程客户;
[0069]所述授权代理服务器根据所述授权线程客户设备的线程ID在其锁申请实时记录中查询所述授权线程客户是否正在申请另一锁;
[0070]所述授权代理服务器将查询结果进行反馈。
[0071]进一步的,所述根据所述依赖路径回溯查找的结果判定是否形成了死锁,包括:
[0072]根据所述依赖路径回溯查找结束的原因判断是否形成了死锁:
[0073]若所述依赖路径回溯查找结束的原因包括:所述第一锁或某个依赖锁无依赖路径,则判定未形成死锁;
[0074]若所述依赖路径回溯查找结束的原因包括:所述第一锁或某个依赖锁有依赖路径,且所述依赖路径中的依赖锁为所述第二锁,则判定形成死锁。
[0075]进一步的,如果根据所述依赖路径回溯查找的结果判定形成死锁,则驳回所述第一线程客户设备对第一锁的授权申请;通知所述第一线程客户设备释放对所述第二锁的占用。
[0076]本实施例中,当根据第一线程客户设备的申请向Master申请第一锁的授权,收到Master的等待消息时,即从本地锁申请实时记录中查找该第一线程客户设备是否已经持有另一个锁,当发现该线程客户设备已经持有另一个锁时,及时发起其第一锁的依赖路径回溯查找,从而能够及时的发现死锁,以便对死锁进行及时的处理,不仅实现了对死锁的实时检测,而且方法简单高效。
[0077]实施例二
[0078]本发明实施例提供了一种死锁检测方法,参见图3,方法流程包括:
[0079]301、本地Proxy接收到程客户设备Tl发送的申请锁a的请求,将线程客户设备Tl挂起,并向Master申请锁a的授权。
[0080]302、本地Proxy接收到Master返回的等待消息;
[0081]303、本地Proxy查询该Tl的锁申请实时记录,发现Tl持有锁X,执行步骤304。
[0082]具体的,Proxy收到Master向Proxy的授权后,需要向本地的锁申请者(即线程客户设备)进行二次授权(即分发),因此Proxy需要维护本地线程客户设备对锁的申请及授权情况的锁申请实时记录。本地Proxy可以根据该线程客户设备Tl的线程ID(Identity,身份标识号码)在锁申请实时记录中查询Tl已经持有的锁以及正在申请的锁。
[0083]304、本地Proxy根据该Tl申请的锁a,发起集群内锁a的依赖路径回溯查找。
[0084]具体的,若线程客户设备T2持有锁a,申请锁b被阻塞,对其它线程客户设备Tl而言,当前如果要申请锁a,就要等到线程客户设备T2对锁b的申请得到回应。这种情况下,路径(T2,锁b)为锁a的依赖路径,T2为锁a的授权线程客户设备,锁b为锁a的依赖锁。
[0085]具体的,锁a的依赖路径回溯查找,是指本地Proxy在集群内查询锁a和/或锁a的依赖锁的依赖路径的过程,在锁a的依赖路径回溯查找过程中:如未找到锁a的依赖路径,则结束所述依赖路径回溯查找;如果查找到锁a的依赖路径,则需要判断该依赖路径中的授权线程客户设备申请的锁(即依赖锁)是否为Tl持有的锁X,如果是锁X,则结束所述依赖路径回溯查找,否则进行依赖锁的依赖路径回溯查找,查找该依赖锁的依赖路径,以此类推,直至查找到某个依赖锁无依赖路径或者某个依赖路径中授权程客户设备申请的锁为所述Tl持有的锁X。
[0086]具体的查找某个锁(如锁a)的依赖路径的方法,请参阅图4,包括如下步骤:
[0087]3041、本地Proxy向Master发送数据包查询锁a是否有授权节点Proxy。
[0088]3042、本地Proxy收到Master回复的锁a的授权节点为ProxyO (PO)。
[0089]3043、本地Proxy向PO发送数据包查询锁a是否有授权线程以及此授权线程客户设备是否正在申请另一个锁。
[0090]具体的,PO根据本地Proxy发送的数据包中的锁a的信息,在PO的锁申请实时记录中查找锁a在节点PO的线程客户设备持有者(即锁a的授权线程客户设备),然后根据锁a的授权线程客户设备的ID在PO的锁申请实时记录中查找该线程客户设备是否正在申请另一个锁,并将查找结果发送给本地Proxy。
[0091]3044、本地Proxy接收PO返回的结果,如果锁a有授权线程客户设备T2且T2正在申请另一个锁(锁b),则判定锁a有依赖路径(T2,锁b),;否则判定锁a无依赖路径。
[0092]305、本地Proxy根据依赖路径回溯查找的结果,判断是否出现死锁。
[0093]具体的,如果本地Proxy在查找结果中发现锁a或某个锁无依赖路径,则判定死锁不成立;如果在查找结果中发现锁a或某个锁的依赖路径为(Tn,锁X),则判定死锁成立。
[0094]例如图5所示,锁a的依赖路径回溯查询的方法如下:
[0095]查询到锁a有依赖路径(T2,锁b);
[0096]继续查询依赖锁b的依赖路径,查询到锁b的依赖路径(T3,锁c);
[0097]继续查询依赖锁c的依赖路径:
[0098]若查询到依赖锁c没有依赖路径,即持有锁c的线程客户设备没有正在申请的其他的锁,则可结束依赖路径回溯查找,并判定死锁不成立;若查询到锁c的依赖路径为(Tn,锁X),即持有锁c的Tn正在锁X的授权,而线程客户设备Tn要得到锁χ的授权回应又要等到Tl得到锁a的授权,而锁a的授权需要等待锁b的授权,锁b的授权需要锁c的授权,各依赖路径之间形成了闭环,因此可结束依赖路径回溯查找,并判定死锁成立。
[0099]具体的,当检测到死锁成立后,本地Proxy将对该死锁进行解除:激活Tl,驳回Tl对锁a的申请请求,并通知Tl尽快释放对锁χ的占用。
[0100]本实施例中,利用各节点的Proxy对锁申请实时记录的维护,在线程客户设备所在节点的Proxy根据线程客户设备对某个锁的申请向Master申请该锁的授权被要求等待时,该Proxy便根据该线程客户设备的线程ID在锁申请实时记录中查找该线程客户设备是否已经持有另一个锁,当发现该线程客户设备已经持有另一个锁时,及时发起该线程客户设备申请的锁的依赖路径回溯查找,根据依赖路径回溯查找的结果是否又回到该线程客户设备持有的另一个锁来判定是否形成了死锁,从而能够及时的发现死锁,并进行解除死锁的处理,不仅实现了对死锁的实时检测,而且方法简单高效。
[0101]实施例三
[0102]本发明实施例还提供了一种死锁检测方法,参见图6,针对集群中常用的ABBA锁进行说明,线程客户设备Tl及Proxyl在节点I上,线程客户设备T2及Proxy2在节点2上,方法流程包括:
[0103]601、线程客户设备Tl向Proxyl申请锁I的授权,Proxyl挂起Tl,向Master发送Request (请求)消息,申请锁I的授权。
[0104]602、Master向Proxyl发送Grant (授权)指示,将锁I的授权发送给Proxyl,Proxyl激活Tl (即向Tl进行锁I的二次授权),此时,Tl持有锁I。
[0105]603、线程客户设备T2向Proxy2申请锁2的授权,Proxy2挂起T2,向Master发送Request消息,请求申请锁2的授权。
[0106]604、Master向Proxy2发送Grant指不,将锁2的授权发送给Proxy2, Proxyl激活T2此时,T2持有锁2。
[0107]605、T2 向 Proxy2 申请锁 I 的授权,Proxy2 挂起 T2,向 Master 发送 Request 消息,请求申请锁I的授权。
[0108]606、Master 向 Proxy2 返回 Suspend (挂起)指令,指不 Proxy2 等待。
[0109]607、Proxy2根据T2的线程ID在其锁申请实时记录中查找,发现T2已经持有锁
Δι O
[0110]608、Proxy2向Master发送Query (查询)请求,查询锁I的授权Proxy。
[0111]609、Master向Proxy2返回Ack (应答)消息,告知Proxy2锁I的授权Proxy为节点 I 的 Proxyl0
[0112]610、Proxy2向Proxyl发送Detect (检测)请求,查询锁I的依赖路径。
[0113]611、Proxyl向Proxy2返回Ack消息,告知Proxy2锁I的拥有者为Tl,但Tl未阻塞在另一个锁上,即锁I不存在依赖路径。
[0114]612、Proxy2判定未形成死锁,执行Master的等待指令。
[0115]613、T1 向 Proxyl 申请锁 2 的授权,Proxyl 挂起 Tl,向 Master 发送 Request 消息,申请锁2的授权。
[0116]614、Master 向 Proxyl 返回 Suspend 指令。
[0117]615、Proxyl根据Tl的线程ID在锁申请实时记录中查找,发现Tl已经持有锁I。
[0118]616> Proxyl 向 Master 发送 Query 请求,查询锁 2 的授权 Proxy。
[0119]617、Master向Proxyl返回Ack消息,告知Proxyl锁2的授权Proxy为节点2的Proxy2。
[0120]618、Proxyl向Proxy2发送Detect请求,查询锁2的依赖路径。
[0121]619、Proxy2向Proxyl返回Ack消息,告知Proxyl锁2的拥有者为T2,T2阻塞在锁I上,即锁2的依赖路径为(Τ2,申请锁I)。
[0122]620,Proxyl根据锁I查询锁申请实时记录,发现锁I的持有者即为申请锁2的Tl,即锁I的依赖路径为(Tl,申请锁2),判定死锁成立。
[0123]具体的,Proxyl检测到死锁后的处理为:激活Tl,驳回Tl对锁2的授权的申请请求,并通知Tl尽快释放对锁I的占用。[0124]本实施中,当线程客户设备Tl申请锁I的授权被挂起时,Tl所在节点的Proxy便根据Tl的线程ID查找该Tl是否已经持有另一个锁,在发现该线程客户设备已经持有锁2时,及时发起锁I的依赖路径回溯查找,根据依赖路径回溯查找的结果是否又回到Tl持有的锁2,判定是否形成了死锁,从而能够及时的发现死锁,并进行解除死锁的处理,不仅实现了对死锁的实时检测,而且方法简单高效。
[0125]实施例四
[0126]参见图7,本发明实施例提供了一种代理服务器,包括:
[0127]接收单元71,用于接收第一线程客户设备对第一锁的申请;
[0128]发送单元72,用于根据所述接收单元71接收的申请向集群锁管理器发送授权请求,申请所述第一锁的授权;
[0129]所述接收单元71,还用于在所述请求发送单元72向集群锁管理器发送授权请求之后,接收所述集群锁管理器返回的等待消息;
[0130]回溯查找单元73,用于在所述接收单元收71到所述等待消息之后,查询本地的锁申请实时记录,若发现所述第一线程客户设备持有第二锁,则在集群内发起所述第一锁的依赖路径回溯查找;
[0131]死锁判定单元74,用于根据所述回溯查找单元的查找结果判定是否形成了死锁。
[0132]进一步的,所述代理服务器还包括:
[0133]存储单元,用于存储本地线程客户设备的锁申请实时记录;
[0134]所述回溯查找单元用于,根据所述第一线程客户设备的线程身份标识号码ID,在所述存储单元中存储的锁申请实时记录中查询所述线程客户设备是否持有所述第二锁。
[0135]进一步的,所述回溯查找单元包括:
[0136]查询模块,用于在所述接收单元收到所述等待消息之后,查询本地的锁申请实时记录;
[0137]依赖查找模块,用于在所述查询模块查找到所述第一线程客户设备持有所述第二锁时,查找第一锁是否有依赖路径;根据所述依赖路径查找的结果判断是否结束所述依赖路径回溯查找:若所述第一锁无依赖路径,或者所述第一锁有依赖路径且所述依赖路径中的依赖锁为所述第二锁,则结束所述依赖路径回溯查找;若所述第一锁有依赖路径,且所述依赖路径中的依赖锁不是所述第二锁,则进行所述依赖锁的依赖路径回溯查找。
[0138]进一步的,所述依赖查找模块包括:
[0139]获取子模块,用于向所述集群锁管理器查询所述第一锁的授权代理服务器,接收所述集群锁管理器返回的所述授权代理服务器的相关信息;
[0140]查询子模块,用于所述获取子模块接收的所述相关信息,向所述授权代理服务器查询所述第一锁是否有授权线程客户设备,以及所述授权线程客户设备是否正在申请另一个锁,并接收所述授权代理服务器反馈的查询结果;
[0141]依赖路径确定子模块,用于根据所述查询子模块接收的查询结果判断所述第一锁是否有依赖路径:若所述第一锁有授权线程客户设备且所述授权线程客户设备正在申请另一个锁,则判定所述第一锁有依赖路径,否则判定所述第一锁无依赖路径。
[0142]进一步的,所述死锁判定单元,在所述依赖查找模块结束所述依赖路径回溯查找之后,根据所述依赖路径回溯查找结束的原因判断是否形成了死锁:若所述依赖路径回溯查找结束的原因包括:所述第一锁或某个依赖锁无依赖路径,则判定未形成死锁;若所述依赖路径回溯查找结束的原因包括:所述第一锁或某个依赖锁有依赖路径,且所述依赖路径中的依赖锁为所述第二锁,则判定形成死锁。
[0143]进一步的,所述代理服务器还包括:死锁处理单元,用于在所述死锁判定单元判定形成死锁后驳回所述第一线程客户设备对第一锁的授权申请,并通知第一线程客户设备尽快释放对第二锁的占用。
[0144]进一步的,所述接收单元,还用于接收另一代理服务器发送的查询请求,所述查询请求携带需查询的锁的相关信息;在所述锁申请实时记录中查找所述查询请求中的锁的授权线程客户设备;
[0145]所述回溯查找单元,还用于在所述接收单元接收到所述查询请求后,根据所述锁的相关信息,在所述存储单元中查找所述查询请求中的锁的授权线程客户设备;以及用于根据所述授权线程客户设备的线程ID在所述本地锁申请实时记录中查询所述授权线程客户设备是否正在申请另一锁;
[0146]所述发送单元,还用于将所述回溯查找单元的查找结果发送给所述另一代理服务器。
[0147]本实施中,本实施例的代理服务器,在根据线程客户设备的申请向Masters申请第一锁的授权而收到等待消息时,便根据该线程客户设备的线程ID查找该线程客户设备是否已经持有第二锁,在发现该线程客户设备已经持有第二锁时,及时向集群锁管理器和/或第一锁的授权代理服务器发起该第一锁的依赖路径回溯查找,然后根据依赖路径回溯查找的结果是否又回到该线程客户设备持有的第二锁判定是否形成了死锁,从而能够及时的发现死锁,并进行解除死锁的处理,不仅实现了对死锁的实时检测,而且方法简单高效。
[0148]实施例五
[0149]本实施例提供一种代理服务器,请参阅图8,所述代理服务器包括:
[0150]接收机81,用于接收第一线程客户设备对第一锁的申请;
[0151]发送机82,用于根据所述接收机81接收的申请向集群锁管理器发送授权请求,申请所述第一锁的授权;
[0152]所述接收机81,还用于在所述发送单元82向集群锁管理器发送授权请求之后,接收所述集群锁管理器返回的等待消息
[0153]处理器83,用于在所述接收机81收到所述等待消息之后,查询本地的锁申请实时记录,若发现所述第一线程客户设备持有第二锁,则在集群内发起所述第一锁的依赖路径回溯查找;以及用于根据所述回溯查找单元的查找结果判定是否形成了死锁。
[0154]进一步的,还包括:存储器,还用于存储本地线程客户设备的锁申请实时记录;所述处理器83用于,根据所述第一线程客户设备的线程身份标识号码ID,在所述存储器存储的所述锁申请实时记录中,查询所述线程客户设备是否持有所述第二锁。
[0155]进一步的,所述处理器83用于,在查找到所述第一线程客户设备持有所述第二锁时,查找第一锁是否有依赖路径;以及用于根据所述依赖路径查找的结果判断是否结束所述依赖路径回溯查找:若所述第一锁无依赖路径,或者所述第一锁有依赖路径且所述依赖路径中的依赖锁为所述第二锁,则结束所述依赖路径回溯查找;若所述第一锁有依赖路径,且所述依赖路径中的依赖锁不是所述第二锁,则进行所述依赖锁的依赖路径回溯查找。[0156]进一步的,所述发送机82,还用于在查找所述第一锁是否有依赖路径时,向所述集群锁管理器查询所述第一锁的授权代理服务器;
[0157]所述接收机81,还用于接收所述集群锁管理器返回的所述授权代理服务器的相关
信息;
[0158]所述发送机82,还用于根据所述接收机81接收的所述相关信息向所述授权代理服务器查询所述第一锁是否有授权线程客户设备以及所述授权线程客户设备是否正在申请另一个锁;
[0159]所述接收机81,还用于接收所述授权代理服务器反馈的查询结果;
[0160]所述处理器81,还用于根据所述接收机81接收的查询结果判断所述第一锁是否有依赖路径:若所述第一锁有授权线程客户设备且所述授权线程客户设备正在申请另一个锁,则判定所述第一锁有依赖路径,否则判定所述第一锁无依赖路径。
[0161]进一步的,所述处理器83,还用于根据所述依赖路径回溯的查找结果判断是否形成了死锁:若所述依赖路径回溯查找结束的原因包括:所述第一锁或某个依赖锁无依赖路径,则判定未形成死锁;若所述依赖路径回溯查找结束的原因包括:所述第一锁或某个依赖锁有依赖路径,且所述依赖路径中的依赖锁为所述第二锁,则判定形成死锁。
[0162]进一步的,所述发送机82,还用于在所述处理器83判定形成死锁后驳回所述第一线程客户设备对第一锁的授权申请,并通知第一线程客户设备释放对第二锁的占用。
[0163]进一步的,所述接收机81,还用于接收另一代理服务器发送的查询请求,所述查询请求携带需查询的锁的相关信息;
[0164]所述处理器83,还用于在所述接收机81接收到所述查询请求后,根据所述锁的相关信息,在所述锁申请实时记录中查找所述查询请求中的锁的授权线程客户设备;以及用于根据所述授权线程客户设备的线程ID在所述本地锁申请实时记录中查询所述授权线程客户设备是否正在申请另一锁;
[0165]所述发送机82,还用于将所述处理器83的查找结果发送给所述另一代理服务器。
[0166]本实施例的代理服务器,在根据线程客户设备的申请向Masters申请第一锁的授权而收到等待消息时,便根据该线程客户设备的线程ID查找该线程客户设备是否已经持有第二锁,在发现该线程客户设备已经持有第二锁时,及时向集群锁管理器和/或第一锁的授权代理服务器发起该第一锁的依赖路径回溯查找,然后根据依赖路径回溯查找的结果是否又回到该线程客户设备持有的第二锁判定是否形成了死锁,从而能够及时的发现死锁,并进行解除死锁的处理,不仅实现了对死锁的实时检测,而且方法简单高效。
[0167]实施例六
[0168]本实施例提供了一种死锁检测系统,请参阅图9,该系统包括:
[0169]第一线程客户设备91,用于发送对第一锁的申请;
[0170]第一代理服务器92,用于接收所述第一线程客户设备91对第一锁的申请,根据所述申请向集群锁管理器93发送授权请求,申请所述第一锁的授权,接收所述集群锁管理器返回的等待消息,查询本地的锁申请实时记录,若查询到所述第一线程客户设备持有第二锁,则在集群内发起所述第一锁的依赖路径回溯查找,根据所述依赖路径回溯查找的结果判定是否形成了死锁;
[0171]集群锁管理器93,用于接收所述第一代理服务器92发送的所述授权请求,向所述第一代理服务器92返回授权或等待消息。
[0172]进一步的,所述第一代理服务器92用于,向所述集群锁管理器93查询所述第一锁的授权代理服务器,接收所述集群锁管理器93返回的所述授权代理服务器的相关信息,根据所述相关信息向所述授权代理服务器查询所述第一锁是否有授权线程客户设备以及所述授权线程客户设备是否正在申请另一个锁,接收所述授权代理服务器反馈的查询结果,根据所述查询结果判断所述第一锁是否有依赖路径:若所述第一锁有授权线程客户设备且所述授权线程客户设备正在申请另一个锁,则判定所述第一锁有依赖路径,否则判定所述第一锁无依赖路径;
[0173]所述集群锁管理器93还用于,当所述第一代理服务器92查询所述第一锁的授权代理服务器时,返回所述授权代理服务器的相关信息给所述第一代理服务器;
[0174]所述系统还包括:
[0175]授权代理服务器,用于当所述第一代理服务器92查询所述第一锁是否有授权线程客户设备以及所述授权线程客户设备是否正在申请另一个锁时,返回查询结果给所述第一代理服务器92。
[0176]进一步的,所述授权代理服务器用于,接收所述第一代理服务器92发送的携带所述第一锁的相关信息的查询请求;根据所述查询请求携带的所述第一锁的相关信息在其锁申请实时记录中查找所述第一锁的授权线程客户;根据所述授权线程客户设备的线程ID在锁申请实时记录中查询所述授权线程客户是否正在申请另一锁;将查询结果反馈给所述第一代理服务器92。
[0177]进一步的,所述第一代理服务器92还用于,接收第二代理服务器发送的查询请求,所述查询请求携带需查询的锁的相关信息,根据所述锁的相关信息,在锁申请实时记录中查找所述锁的授权线程客户设备,根据所述授权线程客户设备的线程ID在所述锁申请实时记录中查询所述授权线程客户设备是否正在申请另一锁,将查找结果发送给所述第二代理服务器;
[0178]所述系统还包括:
[0179]第二代理服务器,用于向所述第一代理服务器92发送携带需查询的锁的相关信息的查询请求,接收所述第一代理服务器返回的查找结果。
[0180]本实施例中,当第一代理服务器根据线程客户设备的申请向Master申请第一锁的授权,收到Master的等待消息时,即从本地锁申请实时记录中查找该线程客户设备是否已经持有另一个锁,当发现该线程客户设备已经持有另一个锁时,在集群内向Master及第一锁的代理服务器发起第一锁的依赖路径回溯查找,从而能够及时的发现死锁,以便对死锁进行及时的处理,不仅实现了对死锁的实时检测,而且方法简单高效。
[0181]综上所述,本发明实施例死锁检测方法、设备及系统,在本地Proxy根据线程客户设备的申请向Master申请第一锁的授权,收到Master的等待消息时,该本地Proxy即从本地锁申请实时记录中,查找该线程客户设备是否已经持有另一个锁,当发现该线程客户设备已经持有第二锁时,及时发起第一锁的依赖的回溯查找,从而能够及时的发现死锁,以便对死锁进行及时的处理,不仅实现了对死锁的实时检测,而且方法简单高效。
[0182]需要说明的是:上述实施例提供的死锁检测设备在执行死锁检测时,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将设备的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。另外,上述实施例提供的死锁检测方法、设备及系统实施例属于同一构思,其具体实现过程详见方法实施例,这里不再赘述。
[0183]上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
[0184]本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。
[0185]以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
【权利要求】
1.一种死锁检测方法,用于代理服务器,所述代理服务器与集群锁管理器及第一线程客户设备之间分别建立通信连接,其特征在于,所述方法包括: 接收所述第一线程客户设备对第一锁的申请; 根据所述申请向所述集群锁管理器发送授权请求,申请所述第一锁的授权; 接收所述集群锁管理器返回的等待消息; 查询本地的锁申请实时记录,若查询到所述第一线程客户设备持有第二锁,则在集群内发起所述第一锁的依赖路径回溯查找; 根据所述依赖路径回溯查找的结果判定是否形成死锁。
2.根据权利要求1所述的方法,其特征在于,所述查询本地的锁申请实时记录,包括: 根据所述第一线程客户设备的线程身份标识号码ID,在所述锁申请实时记录中查询所述第一线程客户设备是否持有所述第二锁。
3.根据权利要求1所述的方法,其特征在于,所述在集群内发起所述第一锁的依赖路径回溯查找,包括: 查找所述第一锁是否有依赖路径; 若所述第一锁无依赖路径,或者所述第一锁有 依赖路径且所述依赖路径中的依赖锁为所述第二锁,则结束所述依赖路径回溯查找; 若所述第一锁有依赖路径,且所述依赖路径中的依赖锁不是所述第二锁,则进行所述依赖锁的依赖路径回溯查找。
4.根据权利要求3所述的方法,其特征在于,所述查找所述第一锁是否有依赖路径,包括: 向所述集群锁管理器查询所述第一锁的授权代理服务器; 接收所述集群锁管理器返回的所述授权代理服务器的相关信息; 根据所述相关信息向所述授权代理服务器查询所述第一锁是否有授权线程客户设备以及所述授权线程客户设备是否正在申请另一个锁; 接收所述授权代理服务器反馈的查询结果; 根据所述查询结果判断所述第一锁是否有依赖路径:若所述第一锁有授权线程客户设备且所述授权线程客户设备正在申请另一个锁,则判定所述第一锁有依赖路径,否则判定所述第一锁无依赖路径。
5.根据权利要求4所述的方法,其特征在于,所述根据所述相关信息向所述授权代理服务器查询所述第一锁是否有授权线程客户设备以及所述授权线程客户设备是否正在申请另一个锁之后,还包括: 所述授权代理服务器接收携带所述第一锁的相关信息的查询请求; 所述授权代理服务器根据所述查询请求携带的所述第一锁的相关信息在其锁申请实时记录中查找所述第一锁的授权线程客户; 所述授权代理服务器根据所述授权线程客户设备的线程ID在其锁申请实时记录中查询所述授权线程客户是否正在申请另一锁; 所述授权代理服务器将查询结果进行反馈。
6.根据权利要求3至5任一项所述的方法,其特征在于,所述根据所述依赖路径回溯查找的结果判定是否形成了死锁,包括:根据所述依赖路径回溯查找结束的原因判断是否形成了死锁: 若所述依赖路径回溯查找结束的原因包括:所述第一锁或某个依赖锁无依赖路径,则判定未形成死锁; 若所述依赖路径回溯查找结束的原因包括:所述第一锁或某个依赖锁有依赖路径,且所述依赖路径中的依赖锁为所述第二锁,则判定形成死锁。
7.根据权利要求1所述的方法,其特征在于,所述方法还包括: 如果根据所述依赖路径回溯查找的结果判定形成死锁,则驳回所述第一线程客户设备对第一锁的授权申请,通知所述第一线程客户设备释放对所述第二锁的占用。
8.—种代理服务器,其特征在于,包括: 接收单元,用于接收第一线程客户设备对第一锁的申请; 发送单元,用于根据所述接收单元接收的申请向集群锁管理器发送授权请求,申请所述第一锁的授权; 所述接收单元,还用于在所述发送单元向集群锁管理器发送授权请求之后,接收所述集群锁管理器返回的等待消息; 回溯查找单元,用于在所述接收单元收到所述等待消息之后,查询本地的锁申请实时记录,若查询到所述第一线程客户设备持有第二锁,则在集群内发起所述第一锁的依赖路径回溯查找; 死锁判定单元,用于根据所述回溯查找单元的查找结果判定是否形成了死锁。
9.根据权利要求8所述的代理服务器,其特征在于,还包括: 存储单元,用于存储线程客户设备的锁申请实时记录; 所述回溯查找单元用于,根据所述第一线程客户设备的线程身份标识号码ID,在所述存储单元存储的锁申请实时记录中查询所述第一线程客户设备是否持有所述第二锁。
10.根据权利要求8所述的代理服务器,其特征在于,所述回溯查找单元包括: 查询模块,用于在所述接收单元收到所述等待消息之后,查询所述存储单元存储的锁申请实时记录; 依赖查找模块,用于在所述查询模块查找到所述第一线程客户设备持有所述第二锁时,查找第一锁是否有依赖路径;若所述第一锁无依赖路径,或者所述第一锁有依赖路径且所述依赖路径中的依赖锁为所述第二锁,则结束所述依赖路径回溯查找;若所述第一锁有依赖路径,且所述依赖路径中的依赖锁不是所述第二锁,则进行所述依赖锁的依赖路径回溯查找。
11.根据权利要求10所述的代理服务器,其特征在于,所述依赖查找模块包括: 获取子模块,用于向所述集群锁管理器查询所述第一锁的授权代理服务器,接收所述集群锁管理器返回的所述授权代理服务器的相关信息; 查询子模块,用于根据所述获取子模块接收的所述相关信息,向所述授权代理服务器查询所述第一锁是否有授权线程客户设备,以及所述授权线程客户设备是否正在申请另一个锁,并接收所述授权代理服务器反馈的查询结果; 依赖路径确定子模块,用于根据所述查询子模块接收的查询结果判断所述第一锁是否有依赖路径:若所述第一锁有授权线程客户设备且所述授权线程客户设备正在申请另一个锁,则判定所述第一锁有依赖路径,否则判定所述第一锁无依赖路径。
12.根据权利要求10或11所述的代理服务器,其特征在于,所述死锁判定单元用于,在所述依赖查找模块结束所述依赖路径回溯查找之后,根据所述依赖路径回溯查找结束的原因判断是否形成了死锁:若所述依赖路径回溯查找结束的原因包括:所述第一锁或某个依赖锁无依赖路径,则判定未形成死锁;若所述依赖路径回溯查找结束的原因包括:所述第一锁或某个依赖锁有依赖路径,且所述依赖路径中的依赖锁为所述第二锁,则判定形成死锁。
13.根据权利要求8所述的代理服务器,其特征在于,所述代理服务器还包括: 死锁处理单元,用于在所述死锁判定单元判定形成死锁后驳回所述第一线程客户设备对第一锁的授权申请,并通知第一线程客户设备释放对第二锁的占用。
14.根据权利要求13所述的代理服务器,其特征在于, 所述接收单元,还用于接收另一代理服务器发送的查询请求,所述查询请求携带需查询的锁的相关信息; 所述回溯查找单元,还用于在所述接收单元接收到所述查询请求后,根据所述锁的相关信息,在所述存储单元存储的锁申请实时记录中查找所述锁的授权线程客户设备;以及用于根据所述授权线程客户设备的线程ID在所述锁申请实时记录中查询所述授权线程客户设备是否正在申请另一锁; 所述发送单元,还用于将所述回溯查找单元的查找结果发送给所述另一代理服务器。
15.一种死锁检测系统,其特征在于,包括: 第一线程客户设备,用于发送对第一锁的申请; 第一代理服务器,所述第一代理服务器包括如权利要求8至14任一项所述的代理服务器,用于接收所述第一线程客户设备对第一锁的申请,根据所述申请向集群锁管理器发送授权请求,申请所述第一锁的授权,接收所述集群锁管理器返回的等待消息,查询本地的锁申请实时记录,若查询到所述第一线程客户设备持有第二锁,则在集群内发起所述第一锁的依赖路径回溯查找,根据所述依赖路径回溯查找的结果判定是否形成了死锁; 集群锁管理器,用于接收所述第一代理服务器发送的所述授权请求,向所述第一代理服务器返回授权或等待消息。
16.根据权利要求15所述的系统,其特征在于, 所述第一代理服务器用于,向所述集群锁管理器查询所述第一锁的授权代理服务器,接收所述集群锁管理器返回的所述授权代理服务器的相关信息,根据所述相关信息向所述授权代理服务器查询所述第一锁是否有授权线程客户设备以及所述授权线程客户设备是否正在申请另一个锁,接收所述授权代理服务器反馈的查询结果,根据所述查询结果判断所述第一锁是否有依赖路径:若所述第一锁有授权线程客户设备且所述授权线程客户设备正在申请另一个锁,则判定所述第一锁有依赖路径,否则判定所述第一锁无依赖路径; 所述集群锁管理器还用于,当所述第一代理服务器查询所述第一锁的授权代理服务器时,返回所述授权代理服务器的相关信息给所述第一代理服务器; 所述系统还包括: 授权代理服务器,所述授权代理服务器包括如权利要求8至14任一项所述的代理服务器,用于当所述第一代理服务器查询所述第一锁是否有授权线程客户设备以及所述授权线程客户设备是否正在申请另一个锁时,返回查询结果给所述第一代理服务器。
【文档编号】G06F9/46GK103678122SQ201310631872
【公开日】2014年3月26日 申请日期:2013年11月29日 优先权日:2013年11月29日
【发明者】岳亮 申请人:华为技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1