// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.

syntax = "proto2";
package kudu.consensus;

option java_package = "org.apache.kudu.consensus";

// Communicates replica management information between servers.
message ReplicaManagementInfoPB {
  // Replica replacement schemes.
  enum ReplacementScheme {
    UNKNOWN = 999;

    // The leader replica evicts the failed replica first, and then the new
    // voter replica is added (a.k.a. '3-2-3' replica management scheme).
    EVICT_FIRST = 0;

    // Add a new non-voter replica, promote the replica to voter once it
    // caught up with the leader, and only after that evict the failed replica
    // (a.k.a. '3-4-3' replica managment scheme).
    PREPARE_REPLACEMENT_BEFORE_EVICTION = 1;
  }

  // Using 'optional' instead of 'required' because at some point we may decide
  // to obsolete this field.
  optional ReplacementScheme replacement_scheme = 1;
}
