paxos_rust/
message.rs

1//! Describes Paxos messages
2
3use std::sync::Arc;
4
5/// A message sent between nodes
6#[derive(Debug, PartialEq, Eq, Hash, Clone)]
7pub enum Message<T> {
8    Prepare(ProposalData),
9    Promise(PromiseData<T>),
10    Accept(AcceptData<T>),
11    Accepted(AcceptedData<T>),
12    Nack,
13}
14
15/// Proposal data (Proposer -> Acceptor)
16#[derive(Debug, PartialEq, Eq, Hash, Clone)]
17pub struct ProposalData {
18    pub id: u64,
19}
20
21/// Promise data (Acceptor -> Proposer)
22#[derive(Debug, PartialEq, Eq, Hash, Clone)]
23pub struct PromiseData<T> {
24    pub id: u64,
25    pub value: Option<Arc<T>>,
26    pub from: u64,
27}
28
29/// Accept data (Proposer -> Acceptor)
30#[derive(Debug, PartialEq, Eq, Hash, Clone)]
31pub struct AcceptData<T> {
32    pub id: u64,
33    pub value: Arc<T>,
34}
35
36/// Accepted data (Acceptor -> Proposer)
37#[derive(Debug, PartialEq, Eq, Hash, Clone)]
38pub struct AcceptedData<T> {
39    pub id: u64,
40    pub value: Arc<T>,
41    pub from: u64,
42}
43
44pub trait Messenger<T> {
45    fn send_prepare(&mut self, msg: Message<T>);
46
47    fn send_promise(&mut self, msg: Message<T>);
48
49    fn send_accept(&mut self, msg: Message<T>);
50
51    fn send_accepted(&mut self, msg: Message<T>);
52
53    fn on_resolution(&mut self, proposal_n: u64, value: Arc<T>);
54}