use std::collections::BTreeMap;
use serde::{Deserialize, Serialize};
use super::{Entry, Index, NodeID, Term};
use crate::error::Result;
use crate::storage;
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct Envelope {
pub from: NodeID,
pub term: Term,
pub to: NodeID,
pub message: Message,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub enum Message {
PreCampaign {
last_index: Index,
last_term: Term,
},
PreCampaignResponse {
vote: bool,
},
Campaign {
last_index: Index,
last_term: Term,
},
CampaignResponse {
vote: bool,
},
Heartbeat {
last_index: Index,
commit_index: Index,
read_seq: ReadSequence,
},
HeartbeatResponse {
match_index: Index,
read_seq: ReadSequence,
},
Append {
base_index: Index,
base_term: Term,
entries: Vec<Entry>,
},
AppendResponse {
match_index: Index,
reject_index: Index,
},
Read { seq: ReadSequence },
ReadResponse { seq: ReadSequence },
ClientRequest {
id: RequestID,
request: Request,
},
ClientResponse {
id: RequestID,
response: Result<Response>,
},
InstallSnapshot {
last_included_index: Index,
last_included_term: Term,
data: Vec<u8>,
membership: crate::raft::membership::MembershipEntry,
},
InstallSnapshotResponse {
last_included_index: Index,
},
}
pub type RequestID = uuid::Uuid;
pub type ReadSequence = u64;
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub enum Request {
Read(Vec<u8>),
Write(Vec<u8>),
WriteSession {
client_id: uuid::Uuid,
seq: u64,
command: Vec<u8>,
},
Status,
ChangeMembership {
voters: std::collections::HashSet<NodeID>,
},
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub enum Response {
Read(Vec<u8>),
Write(Vec<u8>),
Status(Status),
ChangeMembership { index: Index },
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct Status {
pub leader: NodeID,
pub term: Term,
pub match_index: BTreeMap<NodeID, Index>,
pub commit_index: Index,
pub applied_index: Index,
pub storage: storage::Status,
#[serde(default)]
pub voters: std::collections::BTreeSet<NodeID>,
}