#[derive(
Debug,
Clone,
PartialEq,
Eq,
serde::Serialize,
serde::Deserialize,
rkyv::Archive,
rkyv::Serialize,
rkyv::Deserialize,
zerompk::ToMessagePack,
zerompk::FromMessagePack,
)]
pub struct LogEntry {
pub term: u64,
pub index: u64,
pub data: Vec<u8>,
}
#[derive(
Debug,
Clone,
serde::Serialize,
serde::Deserialize,
rkyv::Archive,
rkyv::Serialize,
rkyv::Deserialize,
zerompk::ToMessagePack,
zerompk::FromMessagePack,
)]
pub struct AppendEntriesRequest {
pub term: u64,
pub leader_id: u64,
pub prev_log_index: u64,
pub prev_log_term: u64,
pub entries: Vec<LogEntry>,
pub leader_commit: u64,
pub group_id: u64,
}
#[derive(
Debug,
Clone,
serde::Serialize,
serde::Deserialize,
rkyv::Archive,
rkyv::Serialize,
rkyv::Deserialize,
zerompk::ToMessagePack,
zerompk::FromMessagePack,
)]
pub struct AppendEntriesResponse {
pub term: u64,
pub success: bool,
pub last_log_index: u64,
}
#[derive(
Debug,
Clone,
serde::Serialize,
serde::Deserialize,
rkyv::Archive,
rkyv::Serialize,
rkyv::Deserialize,
zerompk::ToMessagePack,
zerompk::FromMessagePack,
)]
pub struct RequestVoteRequest {
pub term: u64,
pub candidate_id: u64,
pub last_log_index: u64,
pub last_log_term: u64,
pub group_id: u64,
}
#[derive(
Debug,
Clone,
serde::Serialize,
serde::Deserialize,
rkyv::Archive,
rkyv::Serialize,
rkyv::Deserialize,
zerompk::ToMessagePack,
zerompk::FromMessagePack,
)]
pub struct RequestVoteResponse {
pub term: u64,
pub vote_granted: bool,
}
#[derive(
Debug,
Clone,
serde::Serialize,
serde::Deserialize,
rkyv::Archive,
rkyv::Serialize,
rkyv::Deserialize,
zerompk::ToMessagePack,
zerompk::FromMessagePack,
)]
pub struct InstallSnapshotRequest {
pub term: u64,
pub leader_id: u64,
pub last_included_index: u64,
pub last_included_term: u64,
pub offset: u64,
pub data: Vec<u8>,
pub done: bool,
pub group_id: u64,
}
#[derive(
Debug,
Clone,
serde::Serialize,
serde::Deserialize,
rkyv::Archive,
rkyv::Serialize,
rkyv::Deserialize,
zerompk::ToMessagePack,
zerompk::FromMessagePack,
)]
pub struct InstallSnapshotResponse {
pub term: u64,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn log_entry_serde_roundtrip() {
let entry = LogEntry {
term: 5,
index: 42,
data: b"put key=val".to_vec(),
};
let json = sonic_rs::to_string(&entry).unwrap();
let decoded: LogEntry = sonic_rs::from_str(&json).unwrap();
assert_eq!(entry, decoded);
}
#[test]
fn append_entries_heartbeat() {
let req = AppendEntriesRequest {
term: 3,
leader_id: 1,
prev_log_index: 10,
prev_log_term: 2,
entries: vec![],
leader_commit: 8,
group_id: 0,
};
assert!(req.entries.is_empty());
}
#[test]
fn request_vote_serde_roundtrip() {
let req = RequestVoteRequest {
term: 7,
candidate_id: 2,
last_log_index: 100,
last_log_term: 6,
group_id: 5,
};
let json = sonic_rs::to_string(&req).unwrap();
let decoded: RequestVoteRequest = sonic_rs::from_str(&json).unwrap();
assert_eq!(req.term, decoded.term);
assert_eq!(req.candidate_id, decoded.candidate_id);
}
}