void rollback()

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();
      }
    }