// 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;

option java_package = "org.apache.kudu";

// Used to present the maintenance manager's internal state.
message MaintenanceManagerStatusPB {
  message MaintenanceOpPB {
    required string name = 1;
    // Number of times this operation is currently running.
    required uint32 running = 2;
    required bool runnable = 3;
    required int64 ram_anchored_bytes = 4;
    required int64 logs_retained_bytes = 5;
    required double perf_improvement = 6;
    required double workload_score = 7;
  }

  message OpInstancePB {
    required int64 thread_id = 1;
    required string name = 2;
    // How long the op took to run. Only present if the instance completed.
    optional int32 duration_millis = 3;
    // Number of milliseconds since this operation started.
    required int32 millis_since_start = 4;
  }

  // List of all the operations.
  repeated MaintenanceOpPB registered_operations = 1;

  // This list isn't in order of anything. Can contain the same operation multiple times.
  repeated OpInstancePB running_operations = 2;

  // This list isn't in order of anything. Can contain the same operation multiple times.
  repeated OpInstancePB completed_operations = 3;
}
