1use crate::{
2 messages::{ballot_leader_election::BLEMessage, sequence_paxos::PaxosMessage},
3 storage::Entry,
4 util::NodeId,
5};
6#[cfg(feature = "serde")]
7use serde::{Deserialize, Serialize};
8
9pub mod sequence_paxos {
11 use crate::{
12 ballot_leader_election::Ballot,
13 storage::{Entry, SnapshotType, StopSign},
14 util::{NodeId, SequenceNumber},
15 };
16 #[cfg(feature = "serde")]
17 use serde::{Deserialize, Serialize};
18 use std::fmt::Debug;
19
20 #[derive(Copy, Clone, Debug)]
22 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
23 pub struct PrepareReq {
24 pub n: Ballot,
26 }
27
28 #[derive(Copy, Clone, Debug)]
30 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
31 pub struct Prepare {
32 pub n: Ballot,
34 pub decided_idx: u64,
36 pub n_accepted: Ballot,
38 pub accepted_idx: u64,
40 }
41
42 #[derive(Clone, Debug)]
44 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
45 pub struct Promise<T>
46 where
47 T: Entry,
48 {
49 pub n: Ballot,
51 pub n_accepted: Ballot,
53 pub decided_snapshot: Option<SnapshotType<T>>,
55 pub suffix: Vec<T>,
57 pub decided_idx: u64,
59 pub accepted_idx: u64,
61 pub stopsign: Option<StopSign>,
63 }
64
65 #[derive(Clone, Debug)]
67 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
68 pub struct AcceptSync<T>
69 where
70 T: Entry,
71 {
72 pub n: Ballot,
74 pub seq_num: SequenceNumber,
76 pub decided_snapshot: Option<SnapshotType<T>>,
78 pub suffix: Vec<T>,
80 pub sync_idx: u64,
82 pub decided_idx: u64,
84 pub stopsign: Option<StopSign>,
86 #[cfg(feature = "unicache")]
87 pub unicache: T::UniCache,
89 }
90
91 #[derive(Clone, Debug)]
93 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
94 pub struct AcceptDecide<T>
95 where
96 T: Entry,
97 {
98 pub n: Ballot,
100 pub seq_num: SequenceNumber,
102 pub decided_idx: u64,
104 pub entries: Vec<T>,
106 }
107
108 #[derive(Clone, Debug)]
110 #[cfg(feature = "unicache")]
111 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
112 pub struct EncodedAcceptDecide<T>
113 where
114 T: Entry,
115 {
116 pub n: Ballot,
118 pub seq_num: SequenceNumber,
120 pub decided_idx: u64,
122 pub entries: Vec<T::EncodeResult>,
124 }
125
126 #[derive(Copy, Clone, Debug)]
128 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
129 pub struct Accepted {
130 pub n: Ballot,
132 pub accepted_idx: u64,
134 }
135
136 #[derive(Copy, Clone, Debug)]
138 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
139 pub struct Decide {
140 pub n: Ballot,
142 pub seq_num: SequenceNumber,
144 pub decided_idx: u64,
146 }
147
148 #[derive(Clone, Debug)]
150 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
151 pub struct AcceptStopSign {
152 pub n: Ballot,
154 pub seq_num: SequenceNumber,
156 pub ss: StopSign,
158 }
159
160 #[derive(Clone, Debug)]
163 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
164 pub struct NotAccepted {
165 pub n: Ballot,
167 }
168
169 #[allow(missing_docs)]
171 #[derive(Clone, Debug)]
172 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
173 pub enum Compaction {
174 Trim(u64),
175 Snapshot(Option<u64>),
176 }
177
178 #[allow(missing_docs)]
180 #[derive(Clone, Debug)]
181 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
182 pub enum PaxosMsg<T>
183 where
184 T: Entry,
185 {
186 PrepareReq(PrepareReq),
188 #[allow(missing_docs)]
189 Prepare(Prepare),
190 Promise(Promise<T>),
191 AcceptSync(AcceptSync<T>),
192 AcceptDecide(AcceptDecide<T>),
193 Accepted(Accepted),
194 NotAccepted(NotAccepted),
195 Decide(Decide),
196 ProposalForward(Vec<T>),
198 Compaction(Compaction),
199 AcceptStopSign(AcceptStopSign),
200 ForwardStopSign(StopSign),
201 #[cfg(feature = "unicache")]
202 EncodedAcceptDecide(EncodedAcceptDecide<T>),
203 }
204
205 #[derive(Clone, Debug)]
207 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
208 pub struct PaxosMessage<T>
209 where
210 T: Entry,
211 {
212 pub from: NodeId,
214 pub to: NodeId,
216 pub msg: PaxosMsg<T>,
218 }
219}
220
221pub mod ballot_leader_election {
223
224 use crate::{ballot_leader_election::Ballot, util::NodeId};
225 #[cfg(feature = "serde")]
226 use serde::{Deserialize, Serialize};
227
228 #[allow(missing_docs)]
230 #[derive(Clone, Debug)]
231 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
232 pub enum HeartbeatMsg {
233 Request(HeartbeatRequest),
234 Reply(HeartbeatReply),
235 }
236
237 #[derive(Clone, Debug)]
239 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
240 pub struct HeartbeatRequest {
241 pub round: u32,
243 }
244
245 #[derive(Clone, Debug)]
247 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
248 pub struct HeartbeatReply {
249 pub round: u32,
251 pub ballot: Ballot,
253 pub leader: Ballot,
255 pub happy: bool,
257 }
258
259 #[derive(Clone, Debug)]
261 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
262 pub struct BLEMessage {
263 pub from: NodeId,
265 pub to: NodeId,
267 pub msg: HeartbeatMsg,
269 }
270}
271
272#[allow(missing_docs)]
273#[derive(Clone, Debug)]
275#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
276pub enum Message<T>
277where
278 T: Entry,
279{
280 SequencePaxos(PaxosMessage<T>),
281 BLE(BLEMessage),
282}
283
284impl<T> Message<T>
285where
286 T: Entry,
287{
288 pub fn get_sender(&self) -> NodeId {
290 match self {
291 Message::SequencePaxos(p) => p.from,
292 Message::BLE(b) => b.from,
293 }
294 }
295
296 pub fn get_receiver(&self) -> NodeId {
298 match self {
299 Message::SequencePaxos(p) => p.to,
300 Message::BLE(b) => b.to,
301 }
302 }
303}