为什么 Logged Uniform Consensus 可以在故障恢复模型中多次决定?

问题描述

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 (将#修改为@)