//  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 heron.proto.stmgr;
option java_package = "org.apache.heron.proto.stmgr";
option java_outer_classname = "StreamManager";

import "common.proto";
import "physical_plan.proto";

//
// Messages sent by topologymaster
//

message NewPhysicalPlanMessage {
  required heron.proto.system.PhysicalPlan new_pplan = 1;
}

//
// Request/Responses by the instance
//
message RegisterInstanceRequest {
  // Information about the instance registering with us
  required heron.proto.system.Instance instance = 1;
  required string topology_name = 2;
  required string topology_id = 3;
}

message RegisterInstanceResponse {
  required heron.proto.system.Status status = 1;
  // If the assignment is known, send it
  optional heron.proto.system.PhysicalPlan pplan = 2;
}

message NewInstanceAssignmentMessage {
  required heron.proto.system.PhysicalPlan pplan = 1;
}

// messages exchanged between stream managers
message StrMgrHelloRequest {
  required string topology_name = 1;
  required string topology_id = 2;
  required string stmgr = 3;
}

message StrMgrHelloResponse {
  required heron.proto.system.Status status = 1;
}

message StartBackPressureMessage {
  required string topology_name = 1;
  required string topology_id = 2;
  required string stmgr = 3;
  required string message_id = 4;
}

message StopBackPressureMessage {
  required string topology_name = 1;
  required string topology_id = 2;
  required string stmgr = 3;
  required string message_id = 4;
}

// Tuples exchanged between stream managers
message TupleStreamMessage {
  // The src_task of this message
  required int32 src_task_id = 3;
  // This is actually the destination task_id
  required int32 task_id = 1;
  // serialized data
  required bytes set = 2;
  // number of tuples in serialized data tuples only
  required int32 num_tuples = 4;
}
