in src/consensus/aft/raft.h [2342:2440]
void rollback(Index idx)
{
if (consensus_type == ConsensusType::CFT && idx < state->commit_idx)
{
LOG_FAIL_FMT(
"Asked to rollback to idx:{} but committed to commit_idx:{} - "
"ignoring rollback request",
idx,
state->commit_idx);
return;
}
snapshotter->rollback(idx);
store->rollback({get_term_internal(idx), idx}, state->current_view);
LOG_DEBUG_FMT("Setting term in store to: {}", state->current_view);
ledger->truncate(idx);
state->last_idx = idx;
LOG_DEBUG_FMT("Rolled back at {}", idx);
state->view_history.rollback(idx);
while (!committable_indices.empty() && (committable_indices.back() > idx))
{
committable_indices.pop_back();
}
if (
membership_state == kv::MembershipState::Retired &&
retirement_phase == kv::RetirementPhase::Signed)
{
assert(retirement_committable_idx.has_value());
if (retirement_committable_idx.value() > idx)
{
retirement_committable_idx = std::nullopt;
retirement_phase = kv::RetirementPhase::Ordered;
}
}
if (
membership_state == kv::MembershipState::Retired &&
retirement_phase == kv::RetirementPhase::Ordered)
{
assert(retirement_idx.has_value());
if (retirement_idx.value() > idx)
{
retirement_idx = std::nullopt;
retirement_phase = std::nullopt;
membership_state = reconfiguration_type == ONE_TRANSACTION ?
kv::MembershipState::Active :
kv::MembershipState::RetirementInitiated;
LOG_DEBUG_FMT(
"Becoming {} after rollback",
reconfiguration_type == ONE_TRANSACTION ? "Active" :
"RetirementInitiated");
}
}
// Rollback configurations.
bool changed = false;
while (!configurations.empty() && (configurations.back().idx > idx))
{
configurations.pop_back();
changed = true;
}
if (reconfiguration_type == ReconfigurationType::TWO_TRANSACTION)
{
for (auto it = learner_nodes.begin(); it != learner_nodes.end();)
{
if (it->second > idx)
{
it = learner_nodes.erase(it);
}
else
{
it++;
}
}
for (auto it = retired_nodes.begin(); it != retired_nodes.end();)
{
if (it->second > idx)
{
it = retired_nodes.erase(it);
}
else
{
it++;
}
}
}
if (changed)
{
create_and_remove_node_state();
}
}