我们使用 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} 的集群视图
- 等到检测到故障,但两个节点都处于活动状态(假 FD)。
- 节点 A 将怀疑节点 B 并创建新视图 {A|2}
- 可疑节点 B 仍会在视图 {A,B|1} 中。
- 节点 B 正在尝试获取锁“mylock”。
- 节点 A 丢弃来自节点 B 的授权锁定消息,因为它在不同的视图中。
- 执行视图合并,并创建新视图 - {A,B|3}
问题:尝试获取“mylock”的线程挂起lock.tryLock();
,随后每次尝试获取“mylock”也失败。
我们已经使用tryLock(long time, TimeUnit unit)
了指定的超时,并且似乎解决了这个问题。
问题:这是否意味着JGroups impl。没有超时的 Lock.tryLock() 有一个错误,应该避免吗?
谢谢。