Sorry, I think I understand your proposal now. So in the Raft paper/thesis, joint consensus works like:
- Leader L writes Cold,new to its log at position i.
- L replicates all subsequent entries to all members of Cold and Cnew.
- When L's commitIndex >= i, L writes Cnew to its log, and L starts using Cnew.
After this, the servers only in Cold can be shut down.
I think you propose this change?:
- L writes Cold,new to its log at position i.
- L replicates all subsequent entries to all members of Cold and Cnew.
- When L's commitIndex >= i, L starts using Cnew.
So, what's the purpose of writing the Cnew entry? Why can't L just assume Cnew is the configuration if it knows Cold,new is committed?
I think the Cnew entry is useful if L crashes and a new leader L2 is elected. Let's say L2 has Cold,new in its log, but L2's commitIndex < i, so L2 doesn't know whether Cold,new was committed. (The commitIndex is communicated asynchronously, a new leader's commitIndex lags the previous leader's commitIndex by an unknown amount.) What should L2 do? If it commits its next entry with a majority of Cnew only, it risks the "two disjoint majorities" problem of Figure 10 in the paper. So for safety, it should commit an entry with a joint majority of Cold,new. But what if the servers that were only in Cold have been shut down? If a majority of Cold servers are now unavailable, L2 can't proceed.
So I think there's at least one use of the Cnew entry. Future leaders can look in their logs for a Cnew entry. If they see one, they know that Cold,new was committed, so they won't try to contact servers only in Cold anymore. An administrator can wait for the Cnew entry to appear before shutting down the servers only in Cold.