return elector->mon->rank;
}
+void ElectionLogic::elector_reset()
+{
+ elector->mon->bootstrap();
+}
+
+bool ElectionLogic::elector_ever_participated()
+{
+ return elector->mon->has_ever_joined;
+}
+
+unsigned ElectionLogic::elector_paxos_size()
+{
+ return (unsigned)elector->mon->monmap->size();
+}
+
void ElectionLogic::init()
{
expire_event = mon->timer.add_event_after(
g_conf()->mon_election_timeout + plus,
new C_MonContext(mon, [this](int) {
- expire();
+ logic.end_election_period();
}));
}
}
}
-void Elector::expire()
+void ElectionLogic::end_election_period()
{
- dout(5) << "election timer expired" << dendl;
+ dout(5) << "election period ended" << dendl;
// did i win?
- if (logic.electing_me &&
- logic.acked_me.size() > (unsigned)(mon->monmap->size() / 2)) {
+ if (electing_me &&
+ acked_me.size() > (elector_paxos_size() / 2)) {
// i win
- victory();
+ elector->victory();
} else {
// whoever i deferred to didn't declare victory quickly enough.
- if (mon->has_ever_joined)
- logic.start();
+ if (elector_ever_participated())
+ start();
else
- mon->bootstrap();
+ elector_reset();
}
}
-
void Elector::victory()
{
logic.leader_acked = -1;
void bump_epoch(epoch_t e);
void start();
void defer(int who);
+ void end_election_period();
void handle_propose_logic(epoch_t mepoch, int from);
+
private:
// call-outs
void elector_trigger_new_election();
int elector_my_rank();
void elector_propose_to_peers(epoch_t e);
+ void elector_reset();
+ bool elector_ever_participated();
+ unsigned elector_paxos_size();
};
/**
* as far as we know, we may even be dead); so, just propose ourselves as the
* Leader.
*/
- void expire();
+ // void expire();
/**
* Declare Victory.
*