From 3ca09c98fa82d30cb56e4843efd333680530e6dc Mon Sep 17 00:00:00 2001 From: Greg Farnum Date: Fri, 7 Jun 2019 15:05:00 -0700 Subject: [PATCH] elector: hoist expire into ElectionLogic Signed-off-by: Greg Farnum --- src/mon/Elector.cc | 34 ++++++++++++++++++++++++---------- src/mon/Elector.h | 7 ++++++- 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/src/mon/Elector.cc b/src/mon/Elector.cc index 0f0d8045b9b..0c6daf8955e 100644 --- a/src/mon/Elector.cc +++ b/src/mon/Elector.cc @@ -71,6 +71,21 @@ int ElectionLogic::elector_my_rank() 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() { @@ -209,7 +224,7 @@ void Elector::reset_timer(double plus) expire_event = mon->timer.add_event_after( g_conf()->mon_election_timeout + plus, new C_MonContext(mon, [this](int) { - expire(); + logic.end_election_period(); })); } @@ -222,25 +237,24 @@ void Elector::cancel_timer() } } -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; diff --git a/src/mon/Elector.h b/src/mon/Elector.h index 9eeaf5466ba..2593b64a304 100644 --- a/src/mon/Elector.h +++ b/src/mon/Elector.h @@ -42,7 +42,9 @@ public: 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 @@ -53,6 +55,9 @@ private: 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(); }; /** @@ -237,7 +242,7 @@ private: * as far as we know, we may even be dead); so, just propose ourselves as the * Leader. */ - void expire(); + // void expire(); /** * Declare Victory. * -- 2.39.5