/**
 * 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.
 */

// This file contains protocol buffers that are used throughout HDFS -- i.e.
// by the client, server, and data transfer protocols.

option java_package = "org.apache.hadoop.hdfs.protocol.proto";
option java_outer_classname = "JournalProtocolProtos";
option java_generic_services = true;
option java_generate_equals_and_hash = true;

import "hdfs.proto";

/**
 * registration - the registration info of the active NameNode
 * firstTxnId - the first txid in the rolled edit log
 * numTxns - Number of transactions in editlog
 * records - bytes containing serialized journal records
 */
message JournalRequestProto {
  required NamenodeRegistrationProto registration = 1; // Registration info
  required uint64 firstTxnId = 2; // Transaction ID
  required uint32 numTxns = 3;    // Transaction ID
  required bytes records = 4;     // Journal record
}

/**
 * void response
 */
message JournalResponseProto { 
}

/**
 * registration - the registration info of the active NameNode
 * txid - first txid in the new log
 */
message StartLogSegmentRequestProto {
  required NamenodeRegistrationProto registration = 1; // Registration info
  required uint64 txid = 2; // Transaction ID
}

/**
 * void response
 */
message StartLogSegmentResponseProto { 
}

/**
 * Protocol used to journal edits to a remote node. Currently,
 * this is used to publish edits from the NameNode to a BackupNode.
 *
 * See the request and response for details of rpc call.
 */
service JournalProtocolService {
  /**
   * Request sent by active namenode to backup node via 
   * EditLogBackupOutputStream to stream editlog records.
   */
  rpc journal(JournalRequestProto) returns (JournalResponseProto);

  /**
   * Request sent by active namenode to backup node to notify 
   * that the NameNode has rolled its edit logs and is now writing a 
   * new log segment.
   */
  rpc startLogSegment(StartLogSegmentRequestProto) 
      returns (StartLogSegmentResponseProto);
}
