Cleanups
[invirt/third/libt4.git] / paxos.h
1 #ifndef paxos_h
2 #define paxos_h
3
4 #include <string>
5 #include <vector>
6 #include "rpc/rpc.h"
7 #include "paxos_protocol.h"
8 #include "log.h"
9 #include "lock.h"
10
11
12 class paxos_change {
13     public:
14         virtual void paxos_commit(unsigned instance, const std::string & v) = 0;
15         virtual ~paxos_change() {}
16 };
17
18 class acceptor {
19     private:
20         log *l;
21         rpcs *pxs;
22         paxos_change *cfg;
23         std::string me;
24         mutex pxs_mutex;
25
26         // Acceptor state
27         prop_t n_h;             // number of the highest proposal seen in a prepare
28         prop_t n_a;             // number of highest proposal accepted
29         std::string v_a;        // value of highest proposal accepted
30         unsigned instance_h;    // number of the highest instance we have decided
31         std::map<unsigned,std::string> values;  // vals of each instance
32
33         void commit(unsigned instance, const std::string & v, lock & pxs_mutex_lock);
34         paxos_protocol::status preparereq(paxos_protocol::prepareres & r,
35                 const std::string & src, paxos_protocol::preparearg a);
36         paxos_protocol::status acceptreq(bool & r, const std::string & src,
37                 paxos_protocol::acceptarg a);
38         paxos_protocol::status decidereq(int & r, const std::string & src,
39                 paxos_protocol::decidearg a);
40
41         friend class log;
42
43     public:
44         acceptor(class paxos_change *cfg, bool _first, const std::string & _me,
45                 const std::string & _value);
46         ~acceptor() {}
47         void commit(unsigned instance, const std::string & v);
48         unsigned instance() { return instance_h; }
49         const std::string & value(unsigned instance) { return values[instance]; }
50         std::string dump();
51         void restore(const std::string &);
52         rpcs *get_rpcs() { return pxs; }
53         prop_t get_n_h() { return n_h; }
54         unsigned get_instance_h() { return instance_h; }
55 };
56
57 extern bool isamember(const std::string & m, const std::vector<std::string> & nodes);
58 extern std::string print_members(const std::vector<std::string> & nodes);
59
60 class proposer {
61     private:
62         log *l;
63         paxos_change *cfg;
64         acceptor *acc;
65         std::string me;
66         bool break1;
67         bool break2;
68
69         mutex pxs_mutex;
70
71         // Proposer state
72         bool stable;
73         prop_t my_n;            // number of the last proposal used in this instance
74
75         void setn();
76         bool prepare(unsigned instance, std::vector<std::string> & accepts,
77                 const std::vector<std::string> & nodes,
78                 std::string & v);
79         void accept(unsigned instance, std::vector<std::string> & accepts,
80                 const std::vector<std::string> & nodes, const std::string & v);
81         void decide(unsigned instance, const std::vector<std::string> & accepts,
82                 const std::string & v);
83
84         void breakpoint1();
85         void breakpoint2();
86         bool majority(const std::vector<std::string> & l1, const std::vector<std::string> & l2);
87
88         friend class log;
89     public:
90         proposer(class paxos_change *cfg, class acceptor *_acceptor, const std::string &_me);
91         ~proposer() {}
92         bool run(unsigned instance, const std::vector<std::string> & cnodes, const std::string & v);
93         bool isrunning();
94         void breakpoint(int b);
95 };
96
97
98
99 #endif /* paxos_h */