我目前正在處理Chord協議。無限循環findSuccessor?
對於每個節點有兩個功能,findSuccessor
和closestPrecedingNode
,其給定爲僞代碼。
findSuccessor
是:
n.findSuccessor(id)
if(id is.in (n, successor])
return successor;
else
n' = closestPrecedingNode(id);
return n'.findSuccessor(id);
closestPrecedingNode
是:
n.closestPrecedingNode(id)
for i = m downto 1
if(finger[i] is.in (n, id))
return finger[i];
return n;
當創建一個節點,其後繼最初設置爲節點本身,並且其手指表是空的。現在
我的問題是,當只有一個節點發生了什麼,並且它要求除了它自己的ID任何 ID。然後findSuccessor
運行else
區塊並呼叫closestPrecedingNode
。由於手指表是空的,節點本身返回到findSuccessor
。因此n'
然後等於n
。
之後,在n'
上調用findSuccessor
,這是對其自身的遞歸調用。
然後我們有一個無限循環...或者我錯過了什麼?
注:僞代碼是從Chord: A Scalable Peer-to-peer Lookup Protocol for Internet Applications採取5頁
就是這樣,很好:-)。 所以它基本上歸結爲你定義爲「包含在區間內」的問題...... –
儘管如此,您提到的'this'和'successor'之間的比較是必要的,因爲手指表最初可能是空的,但是後繼可能已經被設置到另一個節點(例如直接加入之後)。然後'findSuccessor'的'if'可能會失敗,然後您需要進行比較以避免無限循環。 –
這個函數沒有機會進入無限循環,因爲如果DHT中只有一個節點(k),即節點k是它自己的後繼者,那麼包含它自己的任意任意ID將落入「順時針循環間隔」( k,k]。 – amitkriit