]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
add versioning and awareness bla bla
authorGreg Farnum <gregf@hq.newdream.net>
Fri, 15 Jan 2010 00:27:14 +0000 (16:27 -0800)
committerGreg Farnum <gregf@hq.newdream.net>
Tue, 19 Jan 2010 22:02:45 +0000 (14:02 -0800)
src/cmon.cc
src/mds/CInode.cc
src/mds/mdstypes.h
src/osd/osd_types.h
src/osdc/Journaler.cc

index 9631e7f310f40a6f942d28939dc929e97fae6501..5c35cf81ef8dadd296dc8018fe059e362cdbb1bb 100644 (file)
@@ -111,11 +111,17 @@ int main(int argc, const char **argv)
   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);
+    cerr << "WARNING: mon fs missing feature list.\n"
+        << "Assuming it is old-style and introducing one." << std::endl;
+    //we only want the baseline ~v.18 features assumed to be on disk.
+    //They'll be first in the incompat list.
+    ondisk_features = CompatSet(NULL, 0, NULL, 0,
+                               ceph_mon_feature_incompat,
+                               1);
+  } else {
+    bufferlist::iterator it = features.begin();
+    ondisk_features.decode(it);
   }
-  bufferlist::iterator it = features.begin();
-  ondisk_features.decode(it);
   
   if (!mon_features.writeable(ondisk_features)) {
     cerr << "monitor executable cannot read disk! Missing features: "
index e9e049f5d1ff4d7869708c0ca7cf2540cee08ffe..65fba2d463606cdaa72dcbd68407a9290b991180 100644 (file)
@@ -726,17 +726,18 @@ void CInode::fetch(Context *fin)
 void CInode::_fetched(bufferlist& bl, Context *fin)
 {
   dout(10) << "_fetched" << dendl;
+  CompatSet& mds_features = mdcache->mds->mds_features;
   bufferlist::iterator p = bl.begin();
   nstring magic;
   ::decode(magic, p);
   dout(10) << " magic is '" << magic << "' (expecting '" << CEPH_FS_ONDISK_MAGIC << "')" << dendl;
-  if (magic != CEPH_FS_ONDISK_MAGIC) {
+  if (magic != CEPH_FS_ONDISK_MAGIC && magic != CEPH_FS_OLD_ONDISK_MAGIC) {
     dout(0) << "on disk magic '" << magic << "' != my magic '" << CEPH_FS_ONDISK_MAGIC
            << "'" << dendl;
     fin->finish(-EINVAL);
   } else {
-    ondisk_ino_features.decode(p);
-    CompatSet& mds_features = mdcache->mds->mds_features;
+    if (magic != CEPH_FS_OLD_ONDISK_MAGIC) ondisk_ino_features.decode(p);
+    else ondisk_ino_features = mds_features;
     if ( !mds_features.writeable(ondisk_ino_features)) {
       dout(0) << "mds data on-disk uses unknown features!" << dendl;
       CompatSet diff = mds_features.unsupported(ondisk_ino_features);
index 4f574aa61045aeda89b7d429b710504c62fb59fe..494a075e20e7563cac95a2135e73ef46b7aaa8b2 100644 (file)
@@ -20,7 +20,8 @@ using namespace std;
 
 #include <boost/pool/pool.hpp>
 
-#define CEPH_FS_ONDISK_MAGIC "ceph fs volume v011"
+#define CEPH_FS_ONDISK_MAGIC "ceph fs volume v012"
+#define CEPH_FS_OLD_ONDISK_MAGIC "ceph fs volume v011"
 
 
 //#define MDS_REF_SET      // define me for improved debug output, sanity checking
index 1d64080d695b8c85812ed115449b44632eb7c2be..365874f73b73f01cfaacb7e1cae0e758ed5f7016 100644 (file)
@@ -29,7 +29,8 @@
 
 #define CEPH_OSD_NEARFULL_RATIO .8
 #define CEPH_OSD_FULL_RATIO .95
-
+//this #define copied from OSD.h
+#define CEPH_OSD_FEATURE_INCOMPAT_BASE "initial feature set(~v.18)"
 
 
 /* osdreqid_t - caller name + incarnation# + tid to unique identify this request
@@ -1027,7 +1028,7 @@ public:
   }
 
   void encode(bufferlist &bl) const {
-    __u8 v = 1;
+    __u8 v = 2;
     ::encode(v, bl);
 
     ::encode(magic, bl);
@@ -1052,7 +1053,10 @@ public:
     ::decode(oldest_map, bl);
     ::decode(newest_map, bl);
     ::decode(weight, bl);
-    compat_features.decode(bl);
+    if (v >= 2) compat_features.decode(bl);
+    else { //upgrade it!
+      compat_features.incompat.insert(CEPH_OSD_FEATURE_INCOMPAT_BASE);
+    }
     ::decode(clean_thru, bl);
     ::decode(mounted, bl);
   }
index d4111578e09a5b512a9ba892fd8e9167b581f78b..d3d17ad1274d83f53c769c6feb870a2262269d3a 100644 (file)
@@ -125,12 +125,18 @@ void Journaler::_finish_read_head(int r, bufferlist& bl)
   ::decode(h, p);
 
   if (h.magic != magic) {
-    dout(0) << "on disk magic '" << h.magic << "' != my magic '"
-           << magic << "'" << dendl;
-    list<Context*> ls;
-    ls.swap(waitfor_recover);
-    finish_contexts(ls, -EINVAL);
-    return;
+    //special-case nasty hack for an upgrade path
+#define CEPH_FS_ONDISK_MAGIC "ceph fs volume v012"
+#define CEPH_FS_OLD_ONDISK_MAGIC "ceph fs volume v011"
+    if (strcmp(magic, CEPH_FS_ONDISK_MAGIC) != 0
+        && strcmp(h.magic.c_str(), CEPH_FS_OLD_ONDISK_MAGIC) != 0) {
+      dout(0) << "on disk magic '" << h.magic << "' != my magic '"
+             << magic << "'" << dendl;
+      list<Context*> ls;
+      ls.swap(waitfor_recover);
+      finish_contexts(ls, -EINVAL);
+      return;
+    }
   }
 
   set_layout(&h.layout);