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

Cluster computing 错误故障检测后,怀疑节点中的Lock.tryLock()将永远挂起,cluster-computing,jgroups,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

我们使用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期间获得了锁,我们通常会有几把锁永远挂着

情景是这样的:

  • 我们有一个{a,B|1}的集群视图
  • 等待,直到检测到故障,但两个节点都处于活动状态(false FD)
  • 节点A将怀疑节点B并创建新视图{A | 2}
  • 可疑节点B仍将在视图{A,B|1}中
  • 节点B正在尝试获取锁“mylock”
  • 节点A丢弃来自节点B的授权锁消息,因为它在不同的视图中
  • 执行视图合并,并创建新视图-{A,B|3}
  • 问题:试图获取“mylock”的线程挂在
    lock.tryLock()中行,
    随后每次获取“mylock”的尝试都会失败

    我们使用了指定超时的
    tryLock(longtime,TimeUnit)
    ,似乎解决了这个问题

    问题:这是否意味着JGroups impl。没有超时的Lock.tryLock()的错误是否应该避免


    谢谢。

    另外,为了增加超时,并使用带有超时的
    tryLock()
    ,最好将对等锁更改为中央锁。详情请参阅: