0
我們使用jgroups-3.0.3.Final作爲兩個節點集羣中的集羣鎖定實現。 我們的JGroups設置(簡化)如下:鎖定節點中的Lock.tryLock()在錯誤後永遠掛起失敗檢測
<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()沒有超時有一個錯誤,應該避免?
謝謝。