9 using std::chrono::steady_clock;
10 using std::chrono::seconds;
14 using std::ostringstream;
15 using std::istringstream;
16 using std::ostream_iterator;
17 using std::istream_iterator;
20 using std::min_element;
22 class config_view_change {
24 virtual void commit_change(unsigned view_id) = 0;
25 virtual ~config_view_change() {}
28 class config : public paxos_change {
33 config_view_change *vc;
34 acceptor paxos_acceptor;
35 proposer paxos_proposer;
39 paxos_protocol::status heartbeat(int &r, string m, unsigned instance);
40 string value(const vector<string> &mems) const;
41 vector<string> members(const string &v) const;
42 void get_view(unsigned instance, vector<string> &m, lock &cfg_mutex_lock);
43 bool remove(const string &, lock &cfg_mutex_lock);
44 void reconstruct(lock &cfg_mutex_lock);
46 OK, // response and same view #
47 VIEWERR, // response but different view #
48 FAILURE, // no response
50 heartbeat_t doheartbeat(const string &m, lock &cfg_mutex_lock);
52 config(const string &_first, const string &_me, config_view_change *_vc);
53 unsigned view_id() { return my_view_id; }
54 const string &myaddr() const { return me; }
55 string dump() { return paxos_acceptor.dump(); }
56 void get_view(unsigned instance, vector<string> &m);
57 void restore(const string &s);
58 bool add(const string &, unsigned view_id);
59 bool ismember(const string &m, unsigned view_id);
60 void heartbeater(void);
61 void paxos_commit(unsigned instance, const string &v);
62 // XXX hack; maybe should have its own port number
63 rpcs *get_rpcs() { return paxos_acceptor.get_rpcs(); }
64 void breakpoint(int b) { paxos_proposer.breakpoint(b); }