From 39ca440bfdbc55d7cf11c337b593fee759cb4713 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Wed, 9 Apr 2014 15:27:20 -0700 Subject: [PATCH] mon: move required_features back into Monitor This is simpler and cleaner. Signed-off-by: Sage Weil --- src/mon/Elector.cc | 10 +++------- src/mon/Elector.h | 11 ----------- src/mon/Monitor.cc | 21 +++++++++++++-------- src/mon/Monitor.h | 8 +++++++- 4 files changed, 23 insertions(+), 27 deletions(-) diff --git a/src/mon/Elector.cc b/src/mon/Elector.cc index 1f768b8776470..2ee10f7b96039 100644 --- a/src/mon/Elector.cc +++ b/src/mon/Elector.cc @@ -65,11 +65,6 @@ void Elector::bump_epoch(epoch_t e) } -void Elector::refresh_required_features() -{ - required_features = mon->apply_compatset_features_to_quorum_requirements(); -} - void Elector::start() { if (!participating) { @@ -80,7 +75,6 @@ void Elector::start() acked_me.clear(); classic_mons.clear(); - required_features = mon->apply_compatset_features_to_quorum_requirements(); init(); // start by trying to elect me @@ -219,6 +213,7 @@ void Elector::handle_propose(MMonElection *m) int from = m->get_source().num(); assert(m->epoch % 2 == 1); // election + uint64_t required_features = mon->get_required_features(); if ((required_features ^ m->get_connection()->get_features()) & required_features) { dout(5) << " ignoring propose from mon" << from @@ -283,6 +278,7 @@ void Elector::handle_ack(MMonElection *m) return; } assert(m->epoch == epoch); + uint64_t required_features = mon->get_required_features(); if ((required_features ^ m->get_connection()->get_features()) & required_features) { dout(5) << " ignoring ack from mon" << from @@ -360,7 +356,7 @@ void Elector::nak_old_peer(MMonElection *m) uint64_t supported_features = m->get_connection()->get_features(); if (supported_features & CEPH_FEATURE_OSDMAP_ENC) { - uint64_t required_features = mon->apply_compatset_features_to_quorum_requirements(); + uint64_t required_features = mon->get_required_features(); dout(10) << "sending nak to peer " << m->get_source() << " that only supports " << supported_features << " of the required " << required_features << dendl; diff --git a/src/mon/Elector.h b/src/mon/Elector.h index 9122a5590097c..007fc1167748c 100644 --- a/src/mon/Elector.h +++ b/src/mon/Elector.h @@ -115,8 +115,6 @@ class Elector { */ map acked_me; set classic_mons; - /// features which a monitor must hold for us to defer to them - uint64_t required_features; /** * @} */ @@ -354,7 +352,6 @@ class Elector { epoch(0), participating(true), electing_me(false), - required_features(0), leader_acked(-1) { } /** @@ -391,14 +388,6 @@ class Elector { bump_epoch(epoch + 1); } - /** - * Refresh required features - * - * Force a refresh of the features we require for others to join in - * on an election. - */ - void refresh_required_features(); - /** * Handle received messages. * diff --git a/src/mon/Monitor.cc b/src/mon/Monitor.cc index 0a1349a3fe6f0..890682829eed7 100644 --- a/src/mon/Monitor.cc +++ b/src/mon/Monitor.cc @@ -156,6 +156,7 @@ Monitor::Monitor(CephContext* cct_, string nm, MonitorDBStore *s, state(STATE_PROBING), elector(this), + required_features(0), leader(0), quorum_features(0), scrub_version(0), @@ -364,6 +365,9 @@ void Monitor::read_features() { read_features_off_disk(store, &features); dout(10) << "features " << features << dendl; + + apply_compatset_features_to_quorum_requirements(); + dout(10) << "required_features " << required_features << dendl; } void Monitor::write_features(MonitorDBStore::Transaction &t) @@ -1086,12 +1090,12 @@ void Monitor::handle_sync_get_cookie(MMonSync *m) assert(g_conf->mon_sync_provider_kill_at != 1); // make sure they can understand us. - uint64_t required = apply_compatset_features_to_quorum_requirements(); - if ((required ^ m->get_connection()->get_features()) & required) { + if ((required_features ^ m->get_connection()->get_features()) & + required_features) { dout(5) << " ignoring peer mon." << m->get_source().num() << " has features " << std::hex << m->get_connection()->get_features() - << " but we require " << required << std::dec << dendl; + << " but we require " << required_features << std::dec << dendl; return; } @@ -1671,26 +1675,27 @@ void Monitor::apply_quorum_to_compatset_features() if (new_features.compare(features) != 0) { CompatSet diff = features.unsupported(new_features); - dout(1) << "Enabling new quorum features: " << diff << dendl; + dout(1) << __func__ << " enabling new quorum features: " << diff << dendl; features = new_features; + MonitorDBStore::Transaction t; write_features(t); store->apply_transaction(t); - elector.refresh_required_features(); + apply_compatset_features_to_quorum_requirements(); } } -uint64_t Monitor::apply_compatset_features_to_quorum_requirements() +void Monitor::apply_compatset_features_to_quorum_requirements() { - uint64_t required_features = 0; + required_features = 0; if (features.incompat.contains(CEPH_MON_FEATURE_INCOMPAT_OSD_ERASURE_CODES)) { required_features |= CEPH_FEATURE_OSD_ERASURE_CODES; } if (features.incompat.contains(CEPH_MON_FEATURE_INCOMPAT_OSDMAP_ENC)) { required_features |= CEPH_FEATURE_OSDMAP_ENC; } - return required_features; + dout(10) << __func__ << " required_features " << required_features << dendl; } void Monitor::sync_force(Formatter *f, ostream& ss) diff --git a/src/mon/Monitor.h b/src/mon/Monitor.h index 8e04634aadadb..59292ec46a1d7 100644 --- a/src/mon/Monitor.h +++ b/src/mon/Monitor.h @@ -195,6 +195,9 @@ private: Paxos *paxos; Elector elector; friend class Elector; + + /// features we require of peers (based on on-disk compatset) + uint64_t required_features; int leader; // current leader (to best of knowledge) set quorum; // current active set of monitors (if !starting) @@ -525,8 +528,11 @@ public: uint64_t get_quorum_features() const { return quorum_features; } + uint64_t get_required_features() const { + return quorum_features; + } void apply_quorum_to_compatset_features(); - uint64_t apply_compatset_features_to_quorum_requirements(); + void apply_compatset_features_to_quorum_requirements(); private: void _reset(); ///< called from bootstrap, start_, or join_election -- 2.39.5