]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: use CompatSet in disk format
authorGreg Farnum <gregf@hq.newdream.net>
Thu, 14 Jan 2010 19:12:23 +0000 (11:12 -0800)
committerGreg Farnum <gregf@hq.newdream.net>
Tue, 19 Jan 2010 22:02:45 +0000 (14:02 -0800)
src/cmon.cc
src/mon/Monitor.cc
src/mon/Monitor.h

index e1190f556812da69ae64fd0b8486033f9d34aada..9631e7f310f40a6f942d28939dc929e97fae6501 100644 (file)
@@ -29,11 +29,19 @@ using namespace std;
 
 #include "msg/SimpleMessenger.h"
 
+#include "include/CompatSet.h"
 #include "include/nstring.h"
 
 #include "common/Timer.h"
 #include "common/common_init.h"
 
+extern const int ceph_mon_feature_compat_size;
+extern const char *ceph_mon_feature_compat[];
+extern const int ceph_mon_feature_ro_compat_size;
+extern const char *ceph_mon_feature_ro_compat[];
+extern const int ceph_mon_feature_incompat_size;
+extern const char *ceph_mon_feature_incompat[];
+
 void usage()
 {
   cerr << "usage: cmon -i monid [--mon-data=pathtodata] [flags]" << std::endl;
@@ -66,6 +74,13 @@ int main(int argc, const char **argv)
 
   if (g_conf.clock_tare) g_clock.tare();
 
+  CompatSet mon_features(ceph_mon_feature_compat, ceph_mon_feature_compat_size,
+                        ceph_mon_feature_ro_compat,
+                        ceph_mon_feature_ro_compat_size,
+                        ceph_mon_feature_incompat,
+                        ceph_mon_feature_incompat_size);
+  CompatSet ondisk_features;
+
   MonitorStore store(g_conf.mon_data);
   err = store.mount();
   if (err < 0) {
@@ -93,6 +108,26 @@ int main(int argc, const char **argv)
     exit(1);
   }
 
+  bufferlist features;
+  store.get_bl_ss(features, COMPAT_SET_LOC, 0);
+  if (features.length() == 0) {
+    cerr << "mon fs missing feature list. Exiting now" << std::endl;
+    exit(1);
+  }
+  bufferlist::iterator it = features.begin();
+  ondisk_features.decode(it);
+  
+  if (!mon_features.writeable(ondisk_features)) {
+    cerr << "monitor executable cannot read disk! Missing features: "
+        << std::endl;
+    CompatSet diff = mon_features.unsupported(ondisk_features);
+    for (CompatSet::iterator iter = diff.begin(); iter != diff.end(); ++iter) {
+      cerr << *iter << std::endl;
+    }
+    exit(1);
+  }
+
+
   // monmap?
   MonMap monmap;
   {
index 1df96f6bbb35ee7c63abb3b3b90080597076647b..d02131b6664e1bda910a276c4208e9beb41be7c2 100644 (file)
@@ -72,6 +72,11 @@ static ostream& _prefix(Monitor *mon) {
                << " ";
 }
 
+const char *ceph_mon_feature_compat[ceph_mon_feature_compat_size] = {};
+const char *ceph_mon_feature_ro_compat[ceph_mon_feature_ro_compat_size] = {};
+const char *ceph_mon_feature_incompat[ceph_mon_feature_incompat_size] =
+  { CEPH_MON_FEATURE_INCOMPAT_BASE };
+
 Monitor::Monitor(int w, MonitorStore *s, Messenger *m, MonMap *map) :
   whoami(w), 
   messenger(m),
@@ -891,6 +896,15 @@ int Monitor::mkfs(bufferlist& osdmapbl)
   magicbl.append("\n");
   store->put_bl_ss(magicbl, "magic", 0);
 
+  bufferlist features;
+  CompatSet mon_features(ceph_mon_feature_compat, ceph_mon_feature_compat_size,
+                        ceph_mon_feature_ro_compat,
+                        ceph_mon_feature_ro_compat_size,
+                        ceph_mon_feature_incompat,
+                        ceph_mon_feature_incompat_size);
+  mon_features.encode(features);
+  store->put_bl_ss(features, COMPAT_SET_LOC, 0);
+
   bufferlist monmapbl;
   monmap->encode(monmapbl);
 
index 6f161caed1b4abef1735801eb3fc63e9abf562d1..a1a32f31677fe1c50487cd843013ece35042fbe7 100644 (file)
@@ -51,6 +51,8 @@ class MClass;
 class MAuthRotating;
 class MRoute;
 
+#define COMPAT_SET_LOC "feature_set"
+
 class Monitor : public Dispatcher {
 public:
   // me
@@ -226,4 +228,13 @@ public:
   LogClient *get_logclient() { return &logclient; }
 };
 
+#define CEPH_MON_FEATURE_INCOMPAT_BASE "initial feature set (~v.18)"
+static const int ceph_mon_feature_compat_size = 0;
+static const int ceph_mon_feature_ro_compat_size = 0;
+static const int ceph_mon_feature_incompat_size = 1;
+extern const char *ceph_mon_feature_compat[];
+extern const char *ceph_mon_feature_ro_compat[];
+extern const char *ceph_mon_feature_incompat[];
+
+
 #endif