【问题标题】:Lock.tryLock() in suspecting node are hanging forever after false Failure Detection在错误的故障检测之后,可疑节点中的 Lock.tryLock() 永远挂起
【发布时间】:2013-07-09 15:27:57
【问题描述】:

我们使用 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. 等到检测到故障,但两个节点都处于活动状态(假 FD)。
  3. 节点 A 将怀疑节点 B 并创建新视图 {A|2}
  4. 可疑节点 B 仍会在视图 {A,B|1} 中。
  5. 节点 B 正在尝试获取锁“mylock”。
  6. 节点 A 丢弃来自节点 B 的授权锁定消息,因为它在不同的视图中。
  7. 执行视图合并,并创建新视图 - {A,B|3}

问题:试图获取“mylock”的线程挂在lock.tryLock(); 行, 随后每次尝试获取“mylock”也都失败了。

我们使用了tryLock(long time, TimeUnit unit) 并指定了超时时间,看来它解决了问题。

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

谢谢。

【问题讨论】:

    标签: cluster-computing jgroups


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2016-07-22
      • 1970-01-01
      • 2019-03-28
      • 1970-01-01
      • 1970-01-01
      • 2016-10-26
      • 2013-01-20
      • 1970-01-01
      • 2019-09-11
      相关资源
      最近更新 更多