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