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

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

import "kudu/common/common.proto";
import "kudu/common/wire_protocol.proto";
import "kudu/tablet/metadata.proto";

// Stores the id of the MemRowSet (for inserts or mutations against MRS)
// or of the (row set, delta ID) pair for mutations against a DiskRowSet.
message MemStoreTargetPB {
  // -1 defaults here are so that, if a caller forgets to check has_mrs_id(),
  // they won't accidentally see real-looking (i.e 0) IDs.

  // Either this field...
  optional int64 mrs_id = 1 [ default = -1];

  // ... or both of the following fields are set.
  optional int64 rs_id = 2 [ default = -1 ];
  optional int64 dms_id = 3 [ default = -1 ];

  // If the mutation landed in a rowset whose base data was inserted as a part
  // of a transaction, the rowset will have a transaction ID associated with
  // it that differentiates it from rowsets that were not inserted as a part of
  // a transaction.
  optional int64 rs_txn_id = 4 [ default = -1 ];
}

// Stores the result of an Insert or Mutate.
message OperationResultPB {

  // set on replay to reflect that this operation was already flushed or had previously
  // failed and should not be applied again.
  optional bool skip_on_replay = 1 [ default = false ];

  // set if this particular operation failed
  optional kudu.AppStatusPB failed_status = 2;

  // The stores that the operation affected.
  // For INSERTs, this will always be just one store.
  // For MUTATE, it may be more than one if the mutation arrived during
  // a compaction.
  repeated MemStoreTargetPB mutated_stores = 3;
}

// The final result of an op, including the result of each individual
// operation.
message TxResultPB {
  // all the operations in this op
  repeated OperationResultPB ops = 1;
}

// Delta statistics for a flushed deltastore
message DeltaStatsPB {
  // Number of deletes (deletes result in deletion of an entire row)
  required int64 delete_count = 1;

  // Number of reinserts.
  // Optional for data format compatibility.
  optional int64 reinsert_count = 6 [ default = 0];

  // REMOVED: replaced by column_stats, which maps by column ID,
  // whereas this older version mapped by index.
  // repeated int64 per_column_update_count = 2;

  // The min Timestamp that was stored in this delta.
  required fixed64 min_timestamp = 3;
  // The max Timestamp that was stored in this delta.
  required fixed64 max_timestamp = 4;

  // Per-column statistics about this delta file.
  message ColumnStats {
    // The column ID.
    required int32 col_id = 1;
    // The number of updates which refer to this column ID.
    optional int64 update_count = 2 [ default = 0 ];
  }
  repeated ColumnStats column_stats = 5;
}

message TabletStatusPB {
  required string tablet_id = 1;
  required string table_name = 2;
  optional TabletStatePB state = 3 [ default = UNKNOWN ];
  optional tablet.TabletDataState tablet_data_state = 8 [ default = TABLET_DATA_UNKNOWN ];
  required string last_status = 4;
  // DEPRECATED.
  optional bytes start_key = 5;
  // DEPRECATED.
  optional bytes end_key = 6;
  optional PartitionPB partition = 9;
  optional int64 estimated_on_disk_size = 7;
  repeated bytes data_dirs = 10;
}
