1#[derive(
9 Debug,
10 Clone,
11 PartialEq,
12 Eq,
13 serde::Serialize,
14 serde::Deserialize,
15 rkyv::Archive,
16 rkyv::Serialize,
17 rkyv::Deserialize,
18 zerompk::ToMessagePack,
19 zerompk::FromMessagePack,
20)]
21pub struct LogEntry {
22 pub term: u64,
24 pub index: u64,
26 pub data: Vec<u8>,
29}
30
31#[derive(
36 Debug,
37 Clone,
38 serde::Serialize,
39 serde::Deserialize,
40 rkyv::Archive,
41 rkyv::Serialize,
42 rkyv::Deserialize,
43 zerompk::ToMessagePack,
44 zerompk::FromMessagePack,
45)]
46pub struct AppendEntriesRequest {
47 pub term: u64,
49 pub leader_id: u64,
51 pub prev_log_index: u64,
53 pub prev_log_term: u64,
55 pub entries: Vec<LogEntry>,
57 pub leader_commit: u64,
59 pub group_id: u64,
61}
62
63#[derive(
64 Debug,
65 Clone,
66 serde::Serialize,
67 serde::Deserialize,
68 rkyv::Archive,
69 rkyv::Serialize,
70 rkyv::Deserialize,
71 zerompk::ToMessagePack,
72 zerompk::FromMessagePack,
73)]
74pub struct AppendEntriesResponse {
75 pub term: u64,
77 pub success: bool,
79 pub last_log_index: u64,
82}
83
84#[derive(
86 Debug,
87 Clone,
88 serde::Serialize,
89 serde::Deserialize,
90 rkyv::Archive,
91 rkyv::Serialize,
92 rkyv::Deserialize,
93 zerompk::ToMessagePack,
94 zerompk::FromMessagePack,
95)]
96pub struct RequestVoteRequest {
97 pub term: u64,
99 pub candidate_id: u64,
101 pub last_log_index: u64,
103 pub last_log_term: u64,
105 pub group_id: u64,
107}
108
109#[derive(
110 Debug,
111 Clone,
112 serde::Serialize,
113 serde::Deserialize,
114 rkyv::Archive,
115 rkyv::Serialize,
116 rkyv::Deserialize,
117 zerompk::ToMessagePack,
118 zerompk::FromMessagePack,
119)]
120pub struct RequestVoteResponse {
121 pub term: u64,
123 pub vote_granted: bool,
125}
126
127#[derive(
133 Debug,
134 Clone,
135 serde::Serialize,
136 serde::Deserialize,
137 rkyv::Archive,
138 rkyv::Serialize,
139 rkyv::Deserialize,
140 zerompk::ToMessagePack,
141 zerompk::FromMessagePack,
142)]
143pub struct TimeoutNowRequest {
144 pub term: u64,
146 pub leader_id: u64,
148 pub group_id: u64,
150}
151
152#[derive(
156 Debug,
157 Clone,
158 serde::Serialize,
159 serde::Deserialize,
160 rkyv::Archive,
161 rkyv::Serialize,
162 rkyv::Deserialize,
163 zerompk::ToMessagePack,
164 zerompk::FromMessagePack,
165)]
166#[msgpack(map)]
167pub struct InstallSnapshotRequest {
168 pub term: u64,
170 pub leader_id: u64,
172 pub last_included_index: u64,
174 pub last_included_term: u64,
176 pub offset: u64,
178 pub data: Vec<u8>,
180 pub done: bool,
182 pub group_id: u64,
184 #[serde(default)]
188 #[msgpack(default)]
189 pub total_size: u64,
190}
191
192#[derive(
193 Debug,
194 Clone,
195 serde::Serialize,
196 serde::Deserialize,
197 rkyv::Archive,
198 rkyv::Serialize,
199 rkyv::Deserialize,
200 zerompk::ToMessagePack,
201 zerompk::FromMessagePack,
202)]
203pub struct InstallSnapshotResponse {
204 pub term: u64,
206}
207
208#[cfg(test)]
209mod tests {
210 use super::*;
211
212 #[test]
213 fn log_entry_serde_roundtrip() {
214 let entry = LogEntry {
215 term: 5,
216 index: 42,
217 data: b"put key=val".to_vec(),
218 };
219 let json = sonic_rs::to_string(&entry).unwrap();
220 let decoded: LogEntry = sonic_rs::from_str(&json).unwrap();
221 assert_eq!(entry, decoded);
222 }
223
224 #[test]
225 fn append_entries_heartbeat() {
226 let req = AppendEntriesRequest {
227 term: 3,
228 leader_id: 1,
229 prev_log_index: 10,
230 prev_log_term: 2,
231 entries: vec![],
232 leader_commit: 8,
233 group_id: 0,
234 };
235 assert!(req.entries.is_empty());
236 }
237
238 #[test]
239 fn request_vote_serde_roundtrip() {
240 let req = RequestVoteRequest {
241 term: 7,
242 candidate_id: 2,
243 last_log_index: 100,
244 last_log_term: 6,
245 group_id: 5,
246 };
247 let json = sonic_rs::to_string(&req).unwrap();
248 let decoded: RequestVoteRequest = sonic_rs::from_str(&json).unwrap();
249 assert_eq!(req.term, decoded.term);
250 assert_eq!(req.candidate_id, decoded.candidate_id);
251 }
252}