From 469910be5f0235fe58f0273799c18a824e4b69b6 Mon Sep 17 00:00:00 2001 From: Greg Farnum Date: Fri, 7 Jun 2019 15:19:40 -0700 Subject: [PATCH] elector: hoist victory into ElectionLogic Signed-off-by: Greg Farnum --- src/mon/Elector.cc | 29 +++++++++++++++++++---------- src/mon/Elector.h | 4 ++-- src/mon/Monitor.cc | 2 +- src/mon/Monitor.h | 2 +- 4 files changed, 23 insertions(+), 14 deletions(-) diff --git a/src/mon/Elector.cc b/src/mon/Elector.cc index 0c6daf8955ef7..f7acbdce814f2 100644 --- a/src/mon/Elector.cc +++ b/src/mon/Elector.cc @@ -245,7 +245,7 @@ void ElectionLogic::end_election_period() if (electing_me && acked_me.size() > (elector_paxos_size() / 2)) { // i win - elector->victory(); + declare_victory(); } else { // whoever i deferred to didn't declare victory quickly enough. if (elector_ever_participated()) @@ -255,18 +255,29 @@ void ElectionLogic::end_election_period() } } -void Elector::victory() + +void ElectionLogic::declare_victory() +{ + leader_acked = -1; + electing_me = false; + + set new_quorum; + new_quorum.swap(acked_me); + + ceph_assert(epoch % 2 == 1); // election + bump_epoch(epoch+1); // is over! + + elector->message_victory(new_quorum); +} + +void Elector::message_victory(const set& quorum) { - logic.leader_acked = -1; - logic.electing_me = false; uint64_t cluster_features = CEPH_FEATURES_ALL; mon_feature_t mon_features = ceph::features::mon::get_supported(); - set quorum; map metadata; ceph_release_t min_mon_release{ceph_release_t::unknown}; - for (auto id : logic.acked_me) { - quorum.insert(id); + for (auto id : quorum) { auto i = peer_info.find(id); ceph_assert(i != peer_info.end()); auto& info = i->second; @@ -281,8 +292,6 @@ void Elector::victory() cancel_timer(); - ceph_assert(logic.epoch % 2 == 1); // election - logic.bump_epoch(logic.epoch+1); // is over! // tell everyone! for (set::iterator p = quorum.begin(); @@ -445,7 +454,7 @@ void Elector::handle_ack(MonOpRequestRef op) // is that _everyone_? if (logic.acked_me.size() == mon->monmap->size()) { // if yes, shortcut to election finish - victory(); + logic.declare_victory(); } } else { // ignore, i'm deferring already. diff --git a/src/mon/Elector.h b/src/mon/Elector.h index 2593b64a30459..b0c81035cf598 100644 --- a/src/mon/Elector.h +++ b/src/mon/Elector.h @@ -44,6 +44,7 @@ public: void defer(int who); void end_election_period(); void handle_propose_logic(epoch_t mepoch, int from); + void declare_victory(); private: @@ -264,8 +265,7 @@ private: * @post We have a quorum, composed of the monitors that acked us * @post We sent a message of type OP_VICTORY to each quorum member. */ - void victory(); - + void message_victory(const set& quorum); /** * Handle a message from some other node proposing itself to become it * the Leader. diff --git a/src/mon/Monitor.cc b/src/mon/Monitor.cc index 6ee95fee85c66..89bc41985d0fc 100644 --- a/src/mon/Monitor.cc +++ b/src/mon/Monitor.cc @@ -2136,7 +2136,7 @@ void Monitor::_finish_svc_election() } } -void Monitor::win_election(epoch_t epoch, set& active, uint64_t features, +void Monitor::win_election(epoch_t epoch, const set& active, uint64_t features, const mon_feature_t& mon_features, ceph_release_t min_mon_release, const map& metadata) diff --git a/src/mon/Monitor.h b/src/mon/Monitor.h index 81d9c66f781c1..a369d998b7a15 100644 --- a/src/mon/Monitor.h +++ b/src/mon/Monitor.h @@ -601,7 +601,7 @@ public: void start_election(); void win_standalone_election(); // end election (called by Elector) - void win_election(epoch_t epoch, set& q, + void win_election(epoch_t epoch, const set& q, uint64_t features, const mon_feature_t& mon_features, ceph_release_t min_mon_release, -- 2.39.5