В настоящее время я имею дело с протоколом Chord.
Для каждого узла есть две функции, findSuccessor
и closestPrecedingNode
, которые задаются в виде псевдокода.
findSuccessor
is:
n.findSuccessor(id)
if(id is.in (n, successor])
return successor;
else
n' = closestPrecedingNode(id);
return n'.findSuccessor(id);
closestPrecedingNode
is:
n.closestPrecedingNode(id)
for i = m downto 1
if(finger[i] is.in (n, id))
return finger[i];
return n;
Когда узел создается, его преемник изначально устанавливается на сам узел, а его таблица отпечатков пуста.
Теперь мой вопрос: что происходит, когда есть только один узел, и его запрашивают любой идентификатор, кроме его собственного идентификатора. Затем findSuccessor
запускает блок else
и вызывает closestPrecedingNode
. Так как таблица finger пуста, сам узел возвращается к findSuccessor
. Следовательно, n'
равно n
.
После этого findSuccessor
вызывается для n'
, что является рекурсивным вызовом самого себя.
И тут у нас бесконечный цикл... или я что-то упускаю?
ПРИМЕЧАНИЕ. Псевдокод взят из Chord: A Scalable Peer- Протокол однорангового поиска для Интернет-приложений, стр. 5.