]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: move required_features back into Monitor
authorSage Weil <sage@inktank.com>
Wed, 9 Apr 2014 22:27:20 +0000 (15:27 -0700)
committerSage Weil <sage@inktank.com>
Wed, 9 Apr 2014 23:01:14 +0000 (16:01 -0700)
This is simpler and cleaner.

Signed-off-by: Sage Weil <sage@inktank.com>
src/mon/Elector.cc
src/mon/Elector.h
src/mon/Monitor.cc
src/mon/Monitor.h

index 1f768b8776470a5f165208b0a9614aea5449bb05..2ee10f7b96039bb1baee5662db0ce306f513b8f1 100644 (file)
@@ -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;
index 9122a5590097c062e66df15261f1df3e06dcde4d..007fc1167748c58920148c5da950061ae99327ec 100644 (file)
@@ -115,8 +115,6 @@ class Elector {
    */
   map<int, uint64_t> acked_me;
   set<int> 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.
    *
index 0a1349a3fe6f040a860b099e20b03289b9d1c669..890682829eed755d48f6540e962284765b11eca1 100644 (file)
@@ -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)
index 8e04634aadadbfb89f8e3352448a1bb04b30cda9..59292ec46a1d7879d89dda72f67c546411961445 100644 (file)
@@ -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<int> 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