]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: check min_mon_release during probe
authorSage Weil <sage@redhat.com>
Tue, 29 Jan 2019 19:19:44 +0000 (13:19 -0600)
committerSage Weil <sage@redhat.com>
Wed, 13 Feb 2019 17:46:45 +0000 (11:46 -0600)
This will give us more informative errors messages than the feature bit
strings.

Signed-off-by: Sage Weil <sage@redhat.com>
src/messages/MMonProbe.h
src/mon/Monitor.cc
src/test/mon/test-mon-msg.cc

index 85864dfbc58ee901da5ee673c8333cbc66a97a8b..8b878dfda043d440bfcb06924011a17d8f2e4a6f 100644 (file)
@@ -24,7 +24,7 @@ class MMonProbe : public MessageInstance<MMonProbe> {
 public:
   friend factory;
 
-  static constexpr int HEAD_VERSION = 6;
+  static constexpr int HEAD_VERSION = 7;
   static constexpr int COMPAT_VERSION = 5;
 
   enum {
@@ -57,10 +57,11 @@ public:
   version_t paxos_last_version = 0;
   bool has_ever_joined = 0;
   uint64_t required_features = 0;
+  uint8_t mon_release = 0;
 
   MMonProbe()
     : MessageInstance(MSG_MON_PROBE, HEAD_VERSION, COMPAT_VERSION) {}
-  MMonProbe(const uuid_d& f, int o, const string& n, bool hej)
+  MMonProbe(const uuid_d& f, int o, const string& n, bool hej, uint8_t mr)
     : MessageInstance(MSG_MON_PROBE, HEAD_VERSION, COMPAT_VERSION),
       fsid(f),
       op(o),
@@ -68,7 +69,8 @@ public:
       paxos_first_version(0),
       paxos_last_version(0),
       has_ever_joined(hej),
-      required_features(0) {}
+      required_features(0),
+      mon_release(mr) {}
 private:
   ~MMonProbe() override {}
 
@@ -88,6 +90,8 @@ public:
       out << " new";
     if (required_features)
       out << " required_features " << required_features;
+    if (mon_release)
+      out << " mon_release " << (int)mon_release;
     out << ")";
   }
   
@@ -112,6 +116,7 @@ public:
     encode(paxos_first_version, payload);
     encode(paxos_last_version, payload);
     encode(required_features, payload);
+    encode(mon_release, payload);
   }
   void decode_payload() override {
     auto p = payload.cbegin();
@@ -127,6 +132,10 @@ public:
       decode(required_features, p);
     else
       required_features = 0;
+    if (header.version >= 7)
+      decode(mon_release, p);
+    else
+      mon_release = 0;
   }
 };
 
index 7d8cf5b58ba11e40619aab87646e14e9630729b7..0cd2938e302a333ab14928d3920008823cdf0abf 100644 (file)
@@ -1157,13 +1157,15 @@ void Monitor::bootstrap()
   for (unsigned i = 0; i < monmap->size(); i++) {
     if ((int)i != rank)
       send_mon_message(
-       new MMonProbe(monmap->fsid, MMonProbe::OP_PROBE, name, has_ever_joined),
+       new MMonProbe(monmap->fsid, MMonProbe::OP_PROBE, name, has_ever_joined,
+                     ceph_release()),
        i);
   }
   for (auto& av : extra_probe_peers) {
     if (av != messenger->get_myaddrs()) {
       messenger->send_to_mon(
-       new MMonProbe(monmap->fsid, MMonProbe::OP_PROBE, name, has_ever_joined),
+       new MMonProbe(monmap->fsid, MMonProbe::OP_PROBE, name, has_ever_joined,
+                     ceph_release()),
        av);
     }
   }
@@ -1801,9 +1803,10 @@ void Monitor::handle_probe(MonOpRequestRef op)
     break;
 
   case MMonProbe::OP_MISSING_FEATURES:
-    derr << __func__ << " missing features, have " << CEPH_FEATURES_ALL
+    derr << __func__ << " require release " << m->mon_release << " > "
+        << ceph_release() << ", or missing features (have " << CEPH_FEATURES_ALL
         << ", required " << m->required_features
-        << ", missing " << (m->required_features & ~CEPH_FEATURES_ALL)
+        << ", missing " << (m->required_features & ~CEPH_FEATURES_ALL) << ")"
         << dendl;
     break;
   }
@@ -1816,11 +1819,12 @@ void Monitor::handle_probe_probe(MonOpRequestRef op)
   dout(10) << "handle_probe_probe " << m->get_source_inst() << *m
           << " features " << m->get_connection()->get_features() << dendl;
   uint64_t missing = required_features & ~m->get_connection()->get_features();
-  if (missing) {
-    dout(1) << " peer " << m->get_source_addr() << " missing features "
-           << missing << dendl;
+  if (m->mon_release < monmap->min_mon_release || missing) {
+    dout(1) << " peer " << m->get_source_addr() << " release " << m->mon_release
+           << " < min_mon_release " << monmap->min_mon_release
+           << ", or missing features " << missing << dendl;
     MMonProbe *r = new MMonProbe(monmap->fsid, MMonProbe::OP_MISSING_FEATURES,
-                                name, has_ever_joined);
+                                name, has_ever_joined, monmap->min_mon_release);
     m->required_features = required_features;
     m->get_connection()->send_message(r);
     goto out;
@@ -1843,7 +1847,8 @@ void Monitor::handle_probe_probe(MonOpRequestRef op)
   }
   
   MMonProbe *r;
-  r = new MMonProbe(monmap->fsid, MMonProbe::OP_REPLY, name, has_ever_joined);
+  r = new MMonProbe(monmap->fsid, MMonProbe::OP_REPLY, name, has_ever_joined,
+                   ceph_release());
   r->name = name;
   r->quorum = quorum;
   monmap->encode(r->monmap_bl, m->get_connection()->get_features());
index 9c95086af8477e43a6ad28f19ae54cafd47209be..229aceda3f26b6c5a55a1181a6e61951c3e7c62a 100644 (file)
@@ -21,6 +21,7 @@
 #include "global/global_init.h"
 #include "global/global_context.h"
 #include "common/ceph_argparse.h"
+#include "common/version.h"
 #include "common/dout.h"
 #include "common/debug.h"
 #include "common/Cond.h"
@@ -290,7 +291,8 @@ public:
 TEST_F(MonMsgTest, MMonProbeTest)
 {
   Message *m = new MMonProbe(get_monmap()->fsid,
-                        MMonProbe::OP_PROBE, "b", false);
+                            MMonProbe::OP_PROBE, "b", false,
+                            ceph_release());
   Message *r = send_wait_reply(m, MSG_MON_PROBE);
   ASSERT_NE(IS_ERR(r), 0);
   ASSERT_EQ(PTR_ERR(r), -ETIMEDOUT);