JanusGraph的索引因為要同步不同實例及不同后端的數據,因此不是實時能夠完成的,視配置,網絡和數據量不同,建立/生效索引通常需要一段時間,這也是為什么創建索引時會創建wait()的原因。
在實踐中,我們經常遇到timeout()異常的出現,這一方面有數據量,網絡,配置的原因,另外一方面,如果系統中有未關閉的事務或者無效的實例,均會導致索引創建阻塞,不斷等待,最后超時。下面是我們團隊在使用JansuGraph總結出的,解決索引超時的實踐,希望對后來者有所幫助。
自身Bug
JanusGraph現在發布的版本0.1.1/0.1.0中存在一個bug,也即如果將已經創建的屬性key加入新創建的索引中,索引狀態始終保持在INSTLLED,不會切換到REGISTERED狀態,該問題在github上有,最為簡單的解決方案是升級JansuGraph到主干。0.2.0的發布時間尚未確定。
存在沒有關閉的Transaction
如果圖中存在有沒有關系的Transaction,則索引狀態不會變更,雖然在官方文檔中提到了使用:
graph.tx().rollback()
但該方法只能關閉當前事務,對系統中其他打開的事務無效,可以使用下面的語句替換:
存在幽靈實例
使用下面的語句查詢:
mgmt = graph.openManagement()
mgmt.getOpenInstances();
mgmt.commit();
使用下面的語句關閉:
mgmt = graph.openManagement(); ids = mgmt.getOpenInstances(); for(String id : ids){if(!id.contains("(")){mgmt.forceCloseInstance(id)}}; mgmt.commit();