Чтобы дать контрапункт принятому ответу, самому алгоритму на самом деле никогда не нужно завершать в каком-то ужасно четко определенном смысле. Имеет больше смысла говорить о том, что каждый узел индивидуально прекращает свое участие в алгоритме, который определяется реализацией. Тогда, возможно, вы могли бы сказать, что сам алгоритм завершился, когда выпали все участвующие узлы, если бы это было полезно узнать.
Алгоритм фактически сходится , как только большинство получателей отправляют свои сообщения AcceptPropose
для одного и того же голосования (в том смысле, что после того, как это произошло, нет никакой возможности определить, какое значение может в конечном итоге) быть решенным), но это не такое положение вещей, которое можно наблюдать на практике: например, если бы сеть начала отбрасывать сообщения непосредственно перед отправкой этого набора сообщений AcceptPropose
, ни один узел не смог бы узнать, что алгоритм сходились, пока связь не была восстановлена.
Однако, как только один узел узнает, что алгоритм сходится (получив AcceptPropose
сообщений от большинства), он может поделиться выбранным значением с помощью обычных средств, например, отправив сообщение Decide
по широковещательной рассылке или сплетне и другим узлам, чтобы переслать его, пока каждый узел не узнает, что конвергенция достигнута.
Каждый узел может прекратить свое участие в алгоритме, как только он узнает значение, к которому сходится алгоритм, хотя он может предпочесть продолжать участвовать дольше, в зависимости от ограничений реализации.
Вам нужно немного подумать о отказоустойчивости, чтобы убедить себя, что завершение по решению сохраняет жизнеспособность: если бы все узлы, которые знают, какое значение было решено, должны были умереть, прежде чем они могли бы поделиться им, будет ли прогресс еще возможен? Ответ, к счастью, да: пока большинство узлов остается живым, если любой из них знает определенное значение, он может поделиться им с другими, а если нет, то есть большинство участвующих узлов, которые просто нужно выбрать большее число бюллетеней и запустить еще один тур.
В принятом ответе следует остерегаться одной фразы:
Выбор будет сделан, как только большинство получит сообщение о принятии! (N, v), которое они не обещали игнорировать.
Во-первых, в протоколе нет ничего о , обещающем игнорировать AcceptPropose
сообщений. Обещания относятся к сообщениям Propose
, которые следует игнорировать / отклонять. Большинство AcceptPropose
сообщений могут всегда использоваться для изучения выбранного значения, независимо от номера бюллетеня.
Во-вторых, выбор фактически делается, как только большинство отправляет AcceptPropose
сообщений. Вы не можете наблюдать это напрямую, поэтому вам нужно подождать, пока хотя бы один узел получит AcceptPropose
сообщений от большинства, прежде чем узнает, что выбор сделан. Как только это произойдет, вы можете поделиться выбранным значением с помощью большего количества AcceptPropose
сообщений или с помощью рассылки / сплетен из Decided
сообщений, в зависимости от того, что больше соответствует вашим ограничениям реализации.