]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mon/Elector: respect monmap min_mon_release
authorSage Weil <sage@redhat.com>
Fri, 8 Feb 2019 16:51:25 +0000 (10:51 -0600)
committerSage Weil <sage@redhat.com>
Wed, 13 Feb 2019 17:46:45 +0000 (11:46 -0600)
Signed-off-by: Sage Weil <sage@redhat.com>
src/mon/Elector.cc

index 0e464e6d5a831a286a612d2855e225707a70bd49..ca46d8c74245471ab369850fa1e760e7aa99f6d1 100644 (file)
@@ -261,6 +261,12 @@ void Elector::handle_propose(MonOpRequestRef op)
            << " without required features" << dendl;
     nak_old_peer(op);
     return;
+  } else if (mon->monmap->min_mon_release > m->mon_release) {
+    dout(5) << " ignoring propose from mon" << from
+           << " release " << m->mon_release
+           << " < min_mon_release " << mon->monmap->min_mon_release << dendl;
+    nak_old_peer(op);
+    return;
   } else if (!m->mon_features.contains_all(required_mon_features)) {
     // all the features in 'required_mon_features' not in 'm->mon_features'
     mon_feature_t missing = required_mon_features.diff(m->mon_features);
@@ -419,17 +425,16 @@ void Elector::nak_old_peer(MonOpRequestRef op)
   uint64_t required_features = mon->get_required_features();
   mon_feature_t required_mon_features = mon->get_required_mon_features();
   dout(10) << "sending nak to peer " << m->get_source()
-    << " that only supports " << supported_features
-    << " " << m->mon_features
-    << " of the required " << required_features
-    << " " << required_mon_features
-    << dendl;
-
+          << " supports " << supported_features << " " << m->mon_features
+          << ", required " << required_features << " " << required_mon_features
+          << ", release " << m->mon_release
+          << " vs required " << mon->monmap->min_mon_release
+          << dendl;
   MMonElection *reply = new MMonElection(MMonElection::OP_NAK, m->epoch,
                                          mon->monmap);
   reply->quorum_features = required_features;
   reply->mon_features = required_mon_features;
-  reply->mon_release = ceph_release();
+  reply->mon_release = mon->monmap->min_mon_release;
   mon->features.encode(reply->sharing_bl);
   m->get_connection()->send_message(reply);
 }
@@ -441,20 +446,25 @@ void Elector::handle_nak(MonOpRequestRef op)
   dout(1) << "handle_nak from " << m->get_source()
          << " quorum_features " << m->quorum_features
           << " " << m->mon_features
+         << " min_mon_release " << m->mon_release
           << dendl;
 
-  CompatSet other;
-  auto bi = m->sharing_bl.cbegin();
-  other.decode(bi);
-  CompatSet diff = Monitor::get_supported_features().unsupported(other);
-
-  mon_feature_t mon_supported = ceph::features::mon::get_supported();
-  // all features in 'm->mon_features' not in 'mon_supported'
-  mon_feature_t mon_diff = m->mon_features.diff(mon_supported);
+  if (m->mon_release > ceph_release()) {
+    derr << "Shutting down because I am release " << ceph_release()
+        << " < min_mon_release " << m->mon_release << dendl;
+  } else {
+    CompatSet other;
+    auto bi = m->sharing_bl.cbegin();
+    other.decode(bi);
+    CompatSet diff = Monitor::get_supported_features().unsupported(other);
 
-  derr << "Shutting down because I do not support required monitor features: { "
-       << diff << " } " << mon_diff << dendl;
+    mon_feature_t mon_supported = ceph::features::mon::get_supported();
+    // all features in 'm->mon_features' not in 'mon_supported'
+    mon_feature_t mon_diff = m->mon_features.diff(mon_supported);
 
+    derr << "Shutting down because I lack required monitor features: { "
+        << diff << " } " << mon_diff << dendl;
+  }
   exit(0);
   // the end!
 }