问题描述
Logged Uniform Consensus 是一种在故障恢复模型中工作的共识算法。在书里 Introduction to Reliable and Secure Distributed Programming 第 5.4.4 节(第 234/235 页),Logged Uniform Consensus 的部分实现如下:
upon event <luc,Recovery> do
retrieve(ets,ℓ,decision);
retrieve(startts,startℓ) of instance lec;
(newts,newℓ) := (startts,startℓ);
retrieve (epochdecision) of instance lep.ets;
if epochdecision ̸= ⊥ ∧ decision = ⊥ then
decision := epochdecision;
store (decision);
trigger <luc,Decide | decision>;
aborted := FALSE;
upon event <lep.ts,Decide | epochdecision> such that ts = ets do
retrieve(epochdecision) of instance lep.ets;
if decision = ⊥ then
decision := epochdecision;
store (decision);
trigger <luc,Decide | decision>;
很明显,只有在 trigger <luc,Decide | decision>
时才会执行 decision = ⊥
,并且不可避免地也会执行 decision := epochdecision
。因此,trigger <luc,Decide | decision>
不可能被执行两次。
然而,本书(第 5.4.1 节,第 228 页)指出:
更准确地说,只需要永不崩溃的进程进行决策,一个进程可能会多次决策;
这个自相矛盾的说法困扰了我很久。我希望有人能告诉我哪个是正确的。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)