syntax = "proto3";
package wolf.raft;
service Raft {
rpc Bootstrap (RaftBootstrapReq) returns (RaftBootstrapRes);
rpc AppendEntries (RaftAppendEntriesReq) returns (RaftAppendEntriesRes);
rpc InstallSnapshot (RaftInstallSnapshotReq) returns (RaftInstallSnapshotRes);
rpc Vote (RaftVoteReq) returns (RaftVoteRes);
rpc GetMetrics (RaftGetMetricsReq) returns (RaftGetMetricsRes);
}
/*
Represents all error codes of services
*/
enum ErrorCode {
RAFT_UNDEFINED_ERROR = 0;
RAFT_BOOTSTRAP_FAILED = 1;
RAFT_APPEND_ENTRIES_JSON_OF_REQ_IS_NOT_VALID = 2;
RAFT_APPEND_ENTRIES_FAILED = 3;
RAFT_INSTALL_SNAPSHOT_FAILED = 4;
RAFT_VOTE_FAILED = 5;
RAFT_GET_METRICS_FAILED = 6;
}
/*
The structure of the error response which is shared
between all rpc(s) of all services.
*/
message RaftErrorRes {
string msg_id = 1;
ErrorCode code = 2;
string msg = 3;
}
/*
messages for Bootstrap
*/
message RaftBootstrapReq {
string msg_id = 1;
uint64 number_of_nodes = 3;
}
message RaftBootstrapOkRes {
string msg_id = 1;
}
message RaftBootstrapRes {
oneof response {
RaftBootstrapOkRes ok_res = 1;
RaftErrorRes error_res = 2;
}
}
/*
messages for AppendEntries
*/
message RaftAppendEntriesReq {
string msg_id = 1;
string req = 2;
}
message ConflictOpt {
/// The term of the most recent entry which does not conflict with the received request.
uint64 term = 1;
/// The index of the most recent entry which does not conflict with the received request.
uint64 index =2;
}
message RaftAppendEntriesOkRes {
/// The message id.
string msg_id = 1;
/// The responding node's current term, for leader to update itself.
uint64 term = 2;
/// Will be true if follower contained entry matching `prev_log_index` and `prev_log_term`.
bool success = 3;
/// A value used to implement the _conflicting term_ optimization outlined in §5.3.
/// This value will only be present, and should only be considered, when `success` is `false`.
optional ConflictOpt conflict_opt = 4;
}
message RaftAppendEntriesRes {
oneof response {
RaftAppendEntriesOkRes ok_res = 1;
RaftErrorRes error_res = 2;
}
}
/*
messages for InstallSnapshot
*/
message RaftInstallSnapshotReq {
/// message ID
string msg_id = 1;
/// The leader's current term.
uint64 term = 2;
/// The leader's ID. Useful in redirecting clients.
uint64 leader_id = 3;
/// The snapshot replaces all log entries up through and including this index.
uint64 last_included_index = 4;
/// The term of the `last_included_index`.
uint64 last_included_term = 5;
/// The byte offset where this chunk of data is positioned in the snapshot file.
uint64 offset = 6;
/// Will be `true` if this is the last chunk in the snapshot.
bool done = 7;
/// The raw bytes of the snapshot chunk, starting at `offset`.
bytes data = 8;
}
message RaftInstallSnapshotOkRes {
/// message ID
string msg_id = 1;
/// The receiving node's current term, for leader to update itself.
uint64 term = 2;
}
message RaftInstallSnapshotRes {
oneof response {
RaftInstallSnapshotOkRes ok_res = 1;
RaftErrorRes error_res = 2;
}
}
/*
messages for Vote
*/
message RaftVoteReq {
/// message ID
string msg_id = 1;
/// The candidate's current term.
uint64 term = 2;
/// The candidate's ID.
uint64 candidate_id = 3;
/// The index of the candidate’s last log entry.
uint64 last_log_index = 4;
/// The term of the candidate’s last log entry.
uint64 last_log_term = 5;
}
message RaftVoteOkRes {
/// message ID
string msg_id = 1;
/// The current term of the responding node, for the candidate to update itself.
uint64 term = 2;
/// Will be true if the candidate received a vote from the responder.
bool vote_granted = 3;
}
message RaftVoteRes {
oneof response {
RaftVoteOkRes ok_res = 1;
RaftErrorRes error_res = 2;
}
}
/*
messages for GetMetrics
*/
message RaftGetMetricsReq {
string msg_id = 1;
}
message RaftGetMetricsOkRes {
string msg_id = 1;
string metrics = 2;
}
message RaftGetMetricsRes {
oneof response {
RaftGetMetricsOkRes ok_res = 1;
RaftErrorRes error_res = 2;
}
}