2013-07-09 354 views
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期間獲得這些鎖,我們通常會有多個鎖永遠懸掛。

情形是這樣的:

  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()沒有超時有一個錯誤,應該避免?

謝謝。

回答