From: Sage Weil Date: Tue, 29 Jan 2019 19:19:44 +0000 (-0600) Subject: mon: check min_mon_release during probe X-Git-Tag: v14.1.0~94^2~4 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=6680d7361ad7b4a72e07d57faa9ec7fbca3bd17f;p=ceph.git mon: check min_mon_release during probe This will give us more informative errors messages than the feature bit strings. Signed-off-by: Sage Weil --- diff --git a/src/messages/MMonProbe.h b/src/messages/MMonProbe.h index 85864dfbc58e..8b878dfda043 100644 --- a/src/messages/MMonProbe.h +++ b/src/messages/MMonProbe.h @@ -24,7 +24,7 @@ class MMonProbe : public MessageInstance { 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; } }; diff --git a/src/mon/Monitor.cc b/src/mon/Monitor.cc index 7d8cf5b58ba1..0cd2938e302a 100644 --- a/src/mon/Monitor.cc +++ b/src/mon/Monitor.cc @@ -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()); diff --git a/src/test/mon/test-mon-msg.cc b/src/test/mon/test-mon-msg.cc index 9c95086af847..229aceda3f26 100644 --- a/src/test/mon/test-mon-msg.cc +++ b/src/test/mon/test-mon-msg.cc @@ -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);