mon->messenger->send_message(collect, mon->monmap->get_inst(*p));
}
+ // set timeout event
+ collect_timeout_event = new C_CollectTimeout(this);
+ mon->timer.add_event_after(g_conf.mon_accept_timeout, collect_timeout_event);
}
if (last->pn > accepted_pn) {
// no, try again.
dout(10) << " they had a higher pn than us, picking a new one." << dendl;
+
+ // cancel timeout event
+ mon->timer.cancel_event(collect_timeout_event);
+ collect_timeout_event = 0;
+
collect(last->pn);
} else {
// yes, they accepted our pn. great.
// is that everyone?
if (num_last == mon->get_quorum().size()) {
+ // cancel timeout event
+ mon->timer.cancel_event(collect_timeout_event);
+ collect_timeout_event = 0;
+
// almost...
state = STATE_ACTIVE;
delete last;
}
+void Paxos::collect_timeout()
+{
+ dout(5) << "collect timeout, calling fresh election" << dendl;
+ collect_timeout_event = 0;
+ assert(mon->is_leader());
+ cancel_events();
+ mon->call_election();
+}
+
// leader
void Paxos::begin(bufferlist& v)
void Paxos::cancel_events()
{
+ if (collect_timeout_event) {
+ mon->timer.cancel_event(collect_timeout_event);
+ collect_timeout_event = 0;
+ }
if (accept_timeout_event) {
mon->timer.cancel_event(accept_timeout_event);
accept_timeout_event = 0;
version_t uncommitted_pn;
bufferlist uncommitted_value;
+ Context *collect_timeout_event;
+
// active
set<int> acked_lease;
Context *lease_renew_event;
list<Context*> waiting_for_writeable;
list<Context*> waiting_for_commit;
+ class C_CollectTimeout : public Context {
+ Paxos *paxos;
+ public:
+ C_CollectTimeout(Paxos *p) : paxos(p) {}
+ void finish(int r) {
+ paxos->collect_timeout();
+ }
+ };
+
class C_AcceptTimeout : public Context {
Paxos *paxos;
public:
void collect(version_t oldpn);
void handle_collect(MMonPaxos*);
void handle_last(MMonPaxos*);
+ void collect_timeout();
+
void begin(bufferlist& value);
void handle_begin(MMonPaxos*);
void handle_accept(MMonPaxos*);
void accept_timeout();
+
void commit();
void handle_commit(MMonPaxos*);
void extend_lease();
machine_id(mid),
machine_name(get_paxos_name(mid)),
state(STATE_RECOVERING),
+ collect_timeout_event(0),
lease_renew_event(0),
lease_ack_timeout_event(0),
lease_timeout_event(0),