syntax = "proto3";

package master_pb;

option go_package = "github.com/chrislusf/seaweedfs/weed/pb/master_pb";

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

service Seaweed {
    rpc SendHeartbeat (stream Heartbeat) returns (stream HeartbeatResponse) {
    }
    rpc KeepConnected (stream KeepConnectedRequest) returns (stream VolumeLocation) {
    }
    rpc LookupVolume (LookupVolumeRequest) returns (LookupVolumeResponse) {
    }
    rpc Assign (AssignRequest) returns (AssignResponse) {
    }
    rpc Statistics (StatisticsRequest) returns (StatisticsResponse) {
    }
    rpc CollectionList (CollectionListRequest) returns (CollectionListResponse) {
    }
    rpc CollectionDelete (CollectionDeleteRequest) returns (CollectionDeleteResponse) {
    }
    rpc VolumeList (VolumeListRequest) returns (VolumeListResponse) {
    }
    rpc LookupEcVolume (LookupEcVolumeRequest) returns (LookupEcVolumeResponse) {
    }
    rpc GetMasterConfiguration (GetMasterConfigurationRequest) returns (GetMasterConfigurationResponse) {
    }
    rpc ListMasterClients (ListMasterClientsRequest) returns (ListMasterClientsResponse) {
    }
    rpc LeaseAdminToken (LeaseAdminTokenRequest) returns (LeaseAdminTokenResponse) {
    }
    rpc ReleaseAdminToken (ReleaseAdminTokenRequest) returns (ReleaseAdminTokenResponse) {
    }

}

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

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 volumes
    repeated VolumeShortInformationMessage new_volumes = 10;
    repeated VolumeShortInformationMessage deleted_volumes = 11;
    bool has_no_volumes = 12;

    // erasure coding
    repeated VolumeEcShardInformationMessage ec_shards = 16;
    // delta erasure coding shards
    repeated VolumeEcShardInformationMessage new_ec_shards = 17;
    repeated VolumeEcShardInformationMessage deleted_ec_shards = 18;
    bool has_no_ec_shards = 19;

}

message HeartbeatResponse {
    uint64 volume_size_limit = 1;
    string leader = 2;
    string metrics_address = 3;
    uint32 metrics_interval_seconds = 4;
    repeated StorageBackend storage_backends = 5;
}

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;
    uint32 compact_revision = 11;
    int64 modified_at_second = 12;
    string remote_storage_name = 13;
    string remote_storage_key = 14;
}

message VolumeShortInformationMessage {
    uint32 id = 1;
    string collection = 3;
    uint32 replica_placement = 8;
    uint32 version = 9;
    uint32 ttl = 10;
}

message VolumeEcShardInformationMessage {
    uint32 id = 1;
    string collection = 2;
    uint32 ec_index_bits = 3;
}

message StorageBackend {
    string type = 1;
    string id = 2;
    map<string, string> properties = 3;
}

message Empty {
}

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

message KeepConnectedRequest {
    string name = 1;
    uint32 grpc_port = 2;
}

message VolumeLocation {
    string url = 1;
    string public_url = 2;
    repeated uint32 new_vids = 3;
    repeated uint32 deleted_vids = 4;
    string leader = 5; // optional when leader is not itself
}

message LookupVolumeRequest {
    repeated string volume_ids = 1;
    string collection = 2; // optional, a bit faster if provided.
}
message LookupVolumeResponse {
    message VolumeIdLocation {
        string volume_id = 1;
        repeated Location locations = 2;
        string error = 3;
    }
    repeated VolumeIdLocation volume_id_locations = 1;
}

message Location {
    string url = 1;
    string public_url = 2;
}

message AssignRequest {
    uint64 count = 1;
    string replication = 2;
    string collection = 3;
    string ttl = 4;
    string data_center = 5;
    string rack = 6;
    string data_node = 7;
    uint32 memory_map_max_size_mb = 8;
    uint32 Writable_volume_count = 9;
}
message AssignResponse {
    string fid = 1;
    string url = 2;
    string public_url = 3;
    uint64 count = 4;
    string error = 5;
    string auth = 6;
}

message StatisticsRequest {
    string replication = 1;
    string collection = 2;
    string ttl = 3;
}
message StatisticsResponse {
    string replication = 1;
    string collection = 2;
    string ttl = 3;
    uint64 total_size = 4;
    uint64 used_size = 5;
    uint64 file_count = 6;
}

//
// collection related
//

message StorageType {
    string replication = 1;
    string ttl = 2;
}
message Collection {
    string name = 1;
}
message CollectionListRequest {
    bool include_normal_volumes = 1;
    bool include_ec_volumes = 2;
}
message CollectionListResponse {
    repeated Collection collections = 1;
}

message CollectionDeleteRequest {
    string name = 1;
}
message CollectionDeleteResponse {
}

//
// volume related
//
message DataNodeInfo {
    string id = 1;
    uint64 volume_count = 2;
    uint64 max_volume_count = 3;
    uint64 free_volume_count = 4;
    uint64 active_volume_count = 5;
    repeated VolumeInformationMessage volume_infos = 6;
    repeated VolumeEcShardInformationMessage ec_shard_infos = 7;
    uint64 remote_volume_count = 8;
}
message RackInfo {
    string id = 1;
    uint64 volume_count = 2;
    uint64 max_volume_count = 3;
    uint64 free_volume_count = 4;
    uint64 active_volume_count = 5;
    repeated DataNodeInfo data_node_infos = 6;
    uint64 remote_volume_count = 7;
}
message DataCenterInfo {
    string id = 1;
    uint64 volume_count = 2;
    uint64 max_volume_count = 3;
    uint64 free_volume_count = 4;
    uint64 active_volume_count = 5;
    repeated RackInfo rack_infos = 6;
    uint64 remote_volume_count = 7;
}
message TopologyInfo {
    string id = 1;
    uint64 volume_count = 2;
    uint64 max_volume_count = 3;
    uint64 free_volume_count = 4;
    uint64 active_volume_count = 5;
    repeated DataCenterInfo data_center_infos = 6;
    uint64 remote_volume_count = 7;
}
message VolumeListRequest {
}
message VolumeListResponse {
    TopologyInfo topology_info = 1;
    uint64 volume_size_limit_mb = 2;
}

message LookupEcVolumeRequest {
    uint32 volume_id = 1;
}
message LookupEcVolumeResponse {
    uint32 volume_id = 1;
    message EcShardIdLocation {
        uint32 shard_id = 1;
        repeated Location locations = 2;
    }
    repeated EcShardIdLocation shard_id_locations = 2;
}

message GetMasterConfigurationRequest {
}
message GetMasterConfigurationResponse {
    string metrics_address = 1;
    uint32 metrics_interval_seconds = 2;
    repeated StorageBackend storage_backends = 3;
    string default_replication = 4;
    string leader = 5;
}

message ListMasterClientsRequest {
    string client_type = 1;
}
message ListMasterClientsResponse {
    repeated string grpc_addresses = 1;
}

message LeaseAdminTokenRequest {
    int64 previous_token = 1;
    int64 previous_lock_time = 2;
    string lock_name = 3;
}
message LeaseAdminTokenResponse {
    int64 token = 1;
    int64 lock_ts_ns = 2;
}

message ReleaseAdminTokenRequest {
    int64 previous_token = 1;
    int64 previous_lock_time = 2;
    string lock_name = 3;
}
message ReleaseAdminTokenResponse {
}