use serde::{Deserialize, Serialize};
use crate::{
CatalogCommand, LogId, LogIndex, NodeId, QueueAutoscalePolicyCommand, Round,
SagaJournalCommand, Term, TwoPhaseAbortCommand, TwoPhaseJournalCommand, TwoPhasePrepareCommand,
};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct LogEntry {
pub term: Term,
pub index: LogIndex,
pub payload: EntryPayload,
}
impl LogEntry {
#[must_use]
pub fn id(&self) -> LogId {
LogId::new(self.term, self.index)
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum EntryPayload {
Noop,
Command(Vec<u8>),
Membership(Membership),
Catalog(CatalogCommand),
SagaJournal(SagaJournalCommand),
TwoPhasePrepare(TwoPhasePrepareCommand),
TwoPhaseAbort(TwoPhaseAbortCommand),
TwoPhaseJournal(TwoPhaseJournalCommand),
QueueAutoscalePolicy(QueueAutoscalePolicyCommand),
}
#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize)]
pub struct Membership {
pub voters: Vec<NodeId>,
pub voters_outgoing: Vec<NodeId>,
pub learners: Vec<NodeId>,
}
impl Membership {
#[must_use]
pub fn is_joint(&self) -> bool {
!self.voters_outgoing.is_empty()
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum RaftRpc {
RequestVote(RequestVote),
AppendEntries(AppendEntries),
InstallSnapshot(InstallSnapshot),
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum RaftRpcReply {
RequestVote(RequestVoteReply),
AppendEntries(AppendEntriesReply),
InstallSnapshot(InstallSnapshotReply),
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct RequestVote {
pub term: Term,
pub candidate_id: NodeId,
pub last_log: LogId,
pub pre_vote: bool,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct RequestVoteReply {
pub term: Term,
pub vote_granted: bool,
pub pre_vote: bool,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct AppendEntries {
pub term: Term,
pub leader_id: NodeId,
pub prev_log: LogId,
pub entries: Vec<LogEntry>,
pub leader_commit: LogIndex,
pub round: Round,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct AppendEntriesReply {
pub term: Term,
pub success: bool,
pub conflict_index: Option<LogIndex>,
pub conflict_term: Option<Term>,
pub round: Round,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct InstallSnapshot {
pub term: Term,
pub leader_id: NodeId,
pub last_included: LogId,
pub last_config: Membership,
pub offset: u64,
pub data: Vec<u8>,
pub done: bool,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct InstallSnapshotReply {
pub term: Term,
}