# The empty quorum commits "everything". This is useful for its use in joint # quorums. committed ---- ∞ # A single voter quorum is not final when no index is known. committed cfg=(1) idx=(_) ---- idx ? 0 (id=1) 0 # When an index is known, that's the committed index, and that's final. committed cfg=(1) idx=(12) ---- idx > 12 (id=1) 12 # With two nodes, start out similarly. committed cfg=(1, 2) idx=(_,_) ---- idx ? 0 (id=1) ? 0 (id=2) 0 # The first committed index becomes known (for n1). Nothing changes in the # output because idx=12 is not known to be on a quorum (which is both nodes). committed cfg=(1, 2) idx=(12,_) ---- idx x> 12 (id=1) ? 0 (id=2) 0 # The second index comes in and finalize the decision. The result will be the # smaller of the two indexes. committed cfg=(1,2) idx=(12,5) ---- idx x> 12 (id=1) > 5 (id=2) 5 # No surprises for three nodes. committed cfg=(1,2,3) idx=(_,_,_) ---- idx ? 0 (id=1) ? 0 (id=2) ? 0 (id=3) 0 committed cfg=(1,2,3) idx=(12,_,_) ---- idx xx> 12 (id=1) ? 0 (id=2) ? 0 (id=3) 0 # We see a committed index, but a higher committed index for the last pending # votes could change (increment) the outcome, so not final yet. committed cfg=(1,2,3) idx=(12,5,_) ---- idx xx> 12 (id=1) x> 5 (id=2) ? 0 (id=3) 5 # a) the case in which it does: committed cfg=(1,2,3) idx=(12,5,6) ---- idx xx> 12 (id=1) > 5 (id=2) x> 6 (id=3) 6 # b) the case in which it does not: committed cfg=(1,2,3) idx=(12,5,4) ---- idx xx> 12 (id=1) x> 5 (id=2) > 4 (id=3) 5 # c) a different case in which the last index is pending but it has no chance of # swaying the outcome (because nobody in the current quorum agrees on anything # higher than the candidate): committed cfg=(1,2,3) idx=(5,5,_) ---- idx x> 5 (id=1) > 5 (id=2) ? 0 (id=3) 5 # c) continued: Doesn't matter what shows up last. The result is final. committed cfg=(1,2,3) idx=(5,5,12) ---- idx > 5 (id=1) > 5 (id=2) xx> 12 (id=3) 5 # With all committed idx known, the result is final. committed cfg=(1, 2, 3) idx=(100, 101, 103) ---- idx > 100 (id=1) x> 101 (id=2) xx> 103 (id=3) 101 # Some more complicated examples. Similar to case c) above. The result is # already final because no index higher than 103 is one short of quorum. committed cfg=(1, 2, 3, 4, 5) idx=(101, 104, 103, 103,_) ---- idx x> 101 (id=1) xxxx> 104 (id=2) xx> 103 (id=3) > 103 (id=4) ? 0 (id=5) 103 # A similar case which is not final because another vote for >= 103 would change # the outcome. committed cfg=(1, 2, 3, 4, 5) idx=(101, 102, 103, 103,_) ---- idx x> 101 (id=1) xx> 102 (id=2) xxx> 103 (id=3) > 103 (id=4) ? 0 (id=5) 102