From 4d7b2ceb08936bd121a0d53ac943135819b684f9 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Thu, 22 Apr 2010 13:41:02 -0700 Subject: [PATCH] mds: add CompatSet to mdsmap --- src/include/CompatSet.h | 23 ++++++++++++++++++++--- src/mds/MDS.cc | 6 +----- src/mds/MDS.h | 8 -------- src/mds/MDSMap.cc | 38 ++++++++++++++++++++++++++++++++++++++ src/mds/MDSMap.h | 19 +++++++++++++++++-- src/mon/MDSMonitor.cc | 2 +- 6 files changed, 77 insertions(+), 19 deletions(-) diff --git a/src/include/CompatSet.h b/src/include/CompatSet.h index 41e3b4ed93fdb..a72f9cad1c314 100644 --- a/src/include/CompatSet.h +++ b/src/include/CompatSet.h @@ -58,9 +58,12 @@ struct CompatSet { CompatSet(const Feature _compat[], const Feature _ro_compat[], const Feature _incompat[]) : compat(), ro_compat(), incompat() { - for (int i = 0; _compat[i].id != 0; ++i) compat.insert(_compat[i]); - for (int j = 0; _ro_compat[j].id !=0; ++j) ro_compat.insert(_ro_compat[j]); - for (int k = 0; _incompat[k].id != 0; ++k) incompat.insert(_incompat[k]); + for (int i = 0; _compat[i].id != 0; ++i) + compat.insert(_compat[i]); + for (int j = 0; _ro_compat[j].id != 0; ++j) + ro_compat.insert(_ro_compat[j]); + for (int k = 0; _incompat[k].id != 0; ++k) + incompat.insert(_incompat[k]); } CompatSet() : compat(), ro_compat(), incompat() { } @@ -142,4 +145,18 @@ struct CompatSet { incompat.decode(bl); } }; +WRITE_CLASS_ENCODER(CompatSet) + +inline ostream& operator<<(ostream& out, const CompatSet::FeatureSet& fs) +{ + return out << fs.names; +} + +inline ostream& operator<<(ostream& out, const CompatSet& compat) +{ + return out << "compat=" << compat.compat + << ",rocompat=" << compat.ro_compat + << ",incompat=" << compat.incompat; +} + #endif diff --git a/src/mds/MDS.cc b/src/mds/MDS.cc index bd4568ebe44d0..38b560d84b005 100644 --- a/src/mds/MDS.cc +++ b/src/mds/MDS.cc @@ -71,11 +71,7 @@ #undef dout_prefix #define dout_prefix *_dout << dbeginl << "mds" << whoami << '.' << incarnation << ' ' -const char *ceph_mds_feature_compat[ceph_mds_feature_compat_size] = {}; -const char *ceph_mds_feature_ro_compat[ceph_mds_feature_ro_compat_size]= - {}; -const char *ceph_mds_feature_incompat[ceph_mds_feature_incompat_size] = - { CEPH_MDS_FEATURE_INCOMPAT_BASE }; + // cons/des diff --git a/src/mds/MDS.h b/src/mds/MDS.h index f40a79fc5a534..d4b476df3ce9a 100644 --- a/src/mds/MDS.h +++ b/src/mds/MDS.h @@ -401,12 +401,4 @@ public: } }; -#define CEPH_MDS_FEATURE_INCOMPAT_BASE "initial feature set (~v.18)" -static const int ceph_mds_feature_compat_size = 0; -static const int ceph_mds_feature_ro_compat_size = 0; -static const int ceph_mds_feature_incompat_size = 1; -extern const char *ceph_mds_feature_compat[]; -extern const char *ceph_mds_feature_ro_compat[]; -extern const char *ceph_mds_feature_incompat[]; - #endif diff --git a/src/mds/MDSMap.cc b/src/mds/MDSMap.cc index bf8d5f7a7e70e..4825b54a3e66d 100644 --- a/src/mds/MDSMap.cc +++ b/src/mds/MDSMap.cc @@ -18,6 +18,43 @@ #include using std::stringstream; + +// features + +const struct CompatSet::Feature feature_compat[] = { + END_FEATURE +}; +const struct CompatSet::Feature feature_incompat[] = { + MDS_FEATURE_INCOMPAT_BASE, + END_FEATURE +}; +const struct CompatSet::Feature feature_ro_compat[] = { + END_FEATURE +}; + +CompatSet mdsmap_compat(feature_compat, + feature_ro_compat, + feature_incompat); + +// base (pre v0.20) +const struct CompatSet::Feature feature_compat_base[] = { + END_FEATURE +}; +const struct CompatSet::Feature feature_incompat_base[] = { + MDS_FEATURE_INCOMPAT_BASE, + END_FEATURE +}; +const struct CompatSet::Feature feature_ro_compat_base[] = { + END_FEATURE +}; + +CompatSet mdsmap_compat_base(feature_compat_base, + feature_ro_compat_base, + feature_incompat_base); + + +// ---- + void MDSMap::print(ostream& out) { out << "epoch " << epoch << std::endl; @@ -29,6 +66,7 @@ void MDSMap::print(ostream& out) out << "session_timeout " << session_timeout << "\n" << "session_autoclose " << session_autoclose << "\n"; + out << "\ncompat " << compat << std::endl; out << "\nmax_mds " << max_mds << std::endl; set upset; diff --git a/src/mds/MDSMap.h b/src/mds/MDSMap.h index 35604e2d6e75e..43bddee0f76b5 100644 --- a/src/mds/MDSMap.h +++ b/src/mds/MDSMap.h @@ -27,6 +27,8 @@ using namespace std; #include "config.h" +#include "include/CompatSet.h" + /* boot --> standby, creating, or starting. @@ -51,6 +53,11 @@ using namespace std; */ +extern CompatSet mdsmap_compat; +extern CompatSet mdsmap_compat_base; // pre v0.20 + +#define MDS_FEATURE_INCOMPAT_BASE CompatSet::Feature(1, "base v0.20") + class MDSMap { public: // mds states @@ -165,6 +172,9 @@ protected: map up; // who is in those roles map<__u64,mds_info_t> mds_info; +public: + CompatSet compat; + friend class MDSMonitor; public: @@ -409,8 +419,9 @@ public: ::encode(cas_pg_pool, bl); // kclient ignores everything from here - __u16 ev = 2; + __u16 ev = 3; ::encode(ev, bl); + ::encode(compat, bl); ::encode(metadata_pg_pool, bl); ::encode(created, bl); ::encode(modified, bl); @@ -438,8 +449,12 @@ public: // kclient ignores everything from here __u16 ev = 1; - if (v > 1) + if (v >= 2) ::decode(ev, p); + if (ev >= 3) + ::decode(compat, p); + else + compat = mdsmap_compat_base; ::decode(metadata_pg_pool, p); ::decode(created, p); ::decode(modified, p); diff --git a/src/mon/MDSMonitor.cc b/src/mon/MDSMonitor.cc index 01abfb7506881..850da42b43081 100644 --- a/src/mon/MDSMonitor.cc +++ b/src/mon/MDSMonitor.cc @@ -56,7 +56,6 @@ void MDSMonitor::print_map(MDSMap &m, int dbl) // service methods - void MDSMonitor::create_initial(bufferlist& bl) { dout(10) << "create_initial" << dendl; @@ -65,6 +64,7 @@ void MDSMonitor::create_initial(bufferlist& bl) pending_mdsmap.data_pg_pools.push_back(CEPH_DATA_RULE); pending_mdsmap.metadata_pg_pool = CEPH_METADATA_RULE; pending_mdsmap.cas_pg_pool = CEPH_CASDATA_RULE; + pending_mdsmap.compat = mdsmap_compat; print_map(pending_mdsmap); } -- 2.39.5