]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: add CompatSet to mdsmap
authorSage Weil <sage@newdream.net>
Thu, 22 Apr 2010 20:41:02 +0000 (13:41 -0700)
committerSage Weil <sage@newdream.net>
Thu, 22 Apr 2010 22:12:58 +0000 (15:12 -0700)
src/include/CompatSet.h
src/mds/MDS.cc
src/mds/MDS.h
src/mds/MDSMap.cc
src/mds/MDSMap.h
src/mon/MDSMonitor.cc

index 41e3b4ed93fdb316818a0086afa6f2849079a264..a72f9cad1c31438664963f606f7e2e141c85f824 100644 (file)
@@ -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
index bd4568ebe44d0adbb4a9ae36b26c287669196577..38b560d84b005edc9d687adfe695b481c5c418e1 100644 (file)
 #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
index f40a79fc5a53488c4b26b6ae2ea3bfb8166964a0..d4b476df3ce9a158c34fd5434316c0ae026c3844 100644 (file)
@@ -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
index bf8d5f7a7e70efe9247ca7257d8cc8f4d2a47b5b..4825b54a3e66d1d621d65d85c371f21de4c7e09d 100644 (file)
 #include <sstream>
 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<int> upset;
index 35604e2d6e75e94442a60baad82735cd4b2ec46f..43bddee0f76b5ae8db553695292d7ac718f86621 100644 (file)
@@ -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<int32_t,__u64> 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);
index 01abfb75068812c3f13f8e69566683a520e386f2..850da42b43081e7825b3c96cac8f5d2c35914095 100644 (file)
@@ -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);
 }