syntax = "proto3";

package master_pb;

//////////////////////////////////////////////////

service Seaweed {
    rpc SendHeartbeat (stream Heartbeat) returns (stream HeartbeatResponse) {
    }
    rpc KeepConnected (stream ClientListenRequest) returns (stream VolumeLocation) {
    }
}

//////////////////////////////////////////////////

message Heartbeat {
    string ip = 1;
    uint32 port = 2;
    string public_url = 3;
    uint32 max_volume_count = 4;
    uint64 max_file_key = 5;
    string data_center = 6;
    string rack = 7;
    uint32 admin_port = 8;
    repeated VolumeInformationMessage volumes = 9;
    // delta volume ids
    repeated uint32 new_vids = 10;
    repeated uint32 deleted_vids = 11;
}

message HeartbeatResponse {
    uint64 volumeSizeLimit = 1;
    string secretKey = 2;
    string leader = 3;
}

message VolumeInformationMessage {
    uint32 id = 1;
    uint64 size = 2;
    string collection = 3;
    uint64 file_count = 4;
    uint64 delete_count = 5;
    uint64 deleted_byte_count = 6;
    bool read_only = 7;
    uint32 replica_placement = 8;
    uint32 version = 9;
    uint32 ttl = 10;
}

message Empty {
}

message SuperBlockExtra {
    message ErasureCoding {
        uint32 data = 1;
        uint32 parity = 2;
        repeated uint32 volume_ids = 3;
    }
    ErasureCoding erasure_coding = 1;
}

message ClientListenRequest {
    string name = 1;
}

message VolumeLocation {
    string url = 1;
    string public_url = 2;
    repeated uint32 new_vids = 3;
    repeated uint32 deleted_vids = 4;
}