我们使用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期间获得锁定,我们常常会有几个锁永远挂起。
场景是这样的:
问题:尝试获取“mylock”的帖子在lock.tryLock();
行中挂起,
每次后续尝试“mylock”都会失败。
我们已经使用tryLock(long time, TimeUnit unit)
指定了超时,似乎它解决了问题。
问题:这是否意味着JGroups impl。没有超时的Lock.tryLock()有一个bug,应该避免吗?
感谢。
答案 0 :(得分:0)
除了超时增加并使用tryLock()
超时,最好将PEER_LOCK更改为CENTRAL_LOCK。请在此处查看详细信息:https://community.jboss.org/message/827520