错误的故障检测后,怀疑节点中的Lock.tryLock()永远挂起

时间:2013-07-09 15:27:58

标签: cluster-computing jgroups

我们使用jgroups-3.0.3.Final作为两个节点的集群中的集群宽锁定实现。 我们的JGroups设置(简化)如下:

<config xmlns="urn:org:jgroups"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="urn:org:jgroups http://www.jgroups.org/schema/JGroups-3.0.xsd">
    <TCP bind_port="7800" .../>
    <TCPPING .../>
    <MERGE2  min_interval="10000" max_interval="30000"/>
    <FD_SOCK/>
    <FD timeout="3000" max_tries="3" />
    <VERIFY_SUSPECT timeout="1500" />
    ...
    <PEER_LOCK/> 
</config>

我们按如下方式执行锁定/解锁:

Lock lock = getLockService().getLock("mylock");
try
{
   lock.tryLock();
   //do something
}
finally
{
   lock.unlock();
}

我们期望每天多次进行错误的故障检测,可能是因为FD的超时值太低。 更糟糕的是,如果在这种假FD期间获得锁定,我们常常会有几个锁永远挂起。

场景是这样的:

  1. 我们有{A,B | 1}
  2. 的群集视图
  3. 等到检测到故障,但两个节点都处于活动状态(假FD)。
  4. 节点A将怀疑节点B并创建新视图{A | 2}
  5. 疑似节点B仍在查看{A,B | 1}。
  6. 节点B正在尝试获取锁定“mylock”。
  7. 节点A丢弃来自节点B的授予锁定消息,因为它位于不同的视图中。
  8. 执行查看合并,并创建新视图 - {A,B | 3}
  9. 问题:尝试获取“mylock”的帖子在lock.tryLock();行中挂起, 每次后续尝试“mylock”都会失败。

    我们已经使用tryLock(long time, TimeUnit unit)指定了超时,似乎它解决了问题。

    问题:这是否意味着JGroups impl。没有超时的Lock.tryLock()有一个bug,应该避免吗?

    感谢。

1 个答案:

答案 0 :(得分:0)

除了超时增加并使用tryLock()超时,最好将PEER_LOCK更改为CENTRAL_LOCK。请在此处查看详细信息:https://community.jboss.org/message/827520