6 #include "paxos_protocol.h"
9 using prepareres = paxos_protocol::prepareres;
10 using node_t = paxos_protocol::node_t;
11 using nodes_t = paxos_protocol::nodes_t;
12 using value_t = paxos_protocol::value_t;
16 virtual void paxos_commit(unsigned instance, const value_t & v) = 0;
17 virtual ~paxos_change() {}
20 extern bool isamember(const node_t & m, const nodes_t & nodes);
21 extern bool majority(const nodes_t & l1, const nodes_t & l2);
23 class proposer_acceptor {
28 paxos_change *delegate;
31 rpcs pxs{(in_port_t)stoi(me)};
38 prop_t proposal = {0, me}; // number of the last proposal used in this instance
41 prop_t promise = {0, me}; // number of the highest proposal seen in a prepare
42 prop_t accepted = {0, me}; // number of highest proposal accepted
43 value_t accepted_value; // value of highest proposal accepted
44 unsigned instance_h = 0; // number of the highest instance we have decided
45 map<unsigned,value_t> values; // vals of each instance
48 class log l = {this, me};
50 void commit(unsigned instance, const value_t & v);
51 void commit(unsigned instance, const value_t & v, lock & pxs_mutex_lock);
53 paxos_protocol::status preparereq(prepareres & r, const node_t & src, unsigned instance, prop_t n);
54 paxos_protocol::status acceptreq(bool & r, const node_t & src, unsigned instance, prop_t n, const value_t & v);
55 paxos_protocol::status decidereq(int & r, const node_t & src, unsigned instance, const value_t & v);
57 bool prepare(unsigned instance, nodes_t & accepts, const nodes_t & nodes, value_t & v);
58 void accept(unsigned instance, nodes_t & accepts, const nodes_t & nodes, const value_t & v);
59 void decide(unsigned instance, const nodes_t & accepts, const value_t & v);
65 proposer_acceptor(paxos_change *delegate, bool _first, const node_t & _me, const value_t & _value);
66 unsigned instance() { return instance_h; }
67 const value_t & value(unsigned instance) { return values[instance]; }
68 string dump() { return l.dump(); }
69 void restore(const string & s) { l.restore(s); l.logread(); }
70 rpcs *get_rpcs() { return &pxs; }
72 bool run(unsigned instance, const nodes_t & cnodes, const value_t & v);
73 bool isrunning() { lock ml(proposer_mutex); return !stable; }
74 void breakpoint(int b);