]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: set new incompat GV feature when paxos stabilizes for the first time
authorSage Weil <sage@inktank.com>
Wed, 12 Sep 2012 23:23:33 +0000 (16:23 -0700)
committerSage Weil <sage@inktank.com>
Wed, 19 Sep 2012 18:53:22 +0000 (11:53 -0700)
This is a marker that future versions will use to know whether they can
safely convert the monitor data to the new format.  If the GV feature is
not present, they will refuse to convert.

Also set the ondisk GV feature at the same time.

Signed-off-by: Sage Weil <sage@inktank.com>
src/include/ceph_features.h
src/mon/Monitor.cc

index d00ae7c938b016b1d4828c06ac14283bfe147397..0209d53b06f6aa71f85ab656eec582bfa40c78da 100644 (file)
@@ -24,6 +24,7 @@
 #define CEPH_FEATURE_INDEP_PG_MAP   (1<<17)
 #define CEPH_FEATURE_CRUSH_TUNABLES (1<<18)
 #define CEPH_FEATURE_CHUNKY_SCRUB   (1<<19)
+#define CEPH_FEATURE_MON_GV         (1<<21)
 
 /*
  * Features supported.  Should be everything above.
@@ -48,7 +49,8 @@
         CEPH_FEATURE_MONENC |           \
         CEPH_FEATURE_INDEP_PG_MAP |     \
         CEPH_FEATURE_CRUSH_TUNABLES |   \
-        CEPH_FEATURE_CHUNKY_SCRUB)
+        CEPH_FEATURE_CHUNKY_SCRUB | \
+        CEPH_FEATURE_MON_GV)
 
 #define CEPH_FEATURES_SUPPORTED_DEFAULT  CEPH_FEATURES_ALL
 
index 444e56004357919b759a010054bc699f72279d3b..a7300e3fc064569144a8124185f60a5869b342bc 100644 (file)
@@ -212,6 +212,14 @@ void Monitor::recovered_leader(int id)
   paxos_recovered.insert(id);
   if (paxos_recovered.size() == paxos.size()) {
     dout(10) << "all paxos instances recovered, going writeable" << dendl;
+
+    if (!features.incompat.contains(CEPH_MON_FEATURE_INCOMPAT_GV) &&
+       (quorum_features & CEPH_FEATURE_MON_GV)) {
+      dout(0) << "setting CEPH_MON_FEATURE_INCOMPAT_GV" << dendl;
+      features.incompat.insert(CEPH_MON_FEATURE_INCOMPAT_GV);
+      write_features();
+    }
+
     for (vector<Paxos*>::iterator p = paxos.begin(); p != paxos.end(); p++)
       finish_contexts(g_ceph_context, (*p)->waiting_for_active);
     for (vector<Paxos*>::iterator p = paxos.begin(); p != paxos.end(); p++)
@@ -230,6 +238,14 @@ void Monitor::recovered_peon(int id)
   paxos_recovered.insert(id);
   if (paxos_recovered.size() == paxos.size()) {
     dout(10) << "all paxos instances recovered/leased" << dendl;
+
+    if (!features.incompat.contains(CEPH_MON_FEATURE_INCOMPAT_GV) &&
+       (quorum_features & CEPH_FEATURE_MON_GV)) {
+      dout(0) << "setting CEPH_MON_FEATURE_INCOMPAT_GV" << dendl;
+      features.incompat.insert(CEPH_MON_FEATURE_INCOMPAT_GV);
+      write_features();
+    }
+
   }
 }
 
@@ -297,6 +313,7 @@ CompatSet Monitor::get_supported_features()
   CompatSet::FeatureSet ceph_mon_feature_ro_compat;
   CompatSet::FeatureSet ceph_mon_feature_incompat;
   ceph_mon_feature_incompat.insert(CEPH_MON_FEATURE_INCOMPAT_BASE);
+  ceph_mon_feature_incompat.insert(CEPH_MON_FEATURE_INCOMPAT_GV);
   return CompatSet(ceph_mon_feature_compat, ceph_mon_feature_ro_compat,
                   ceph_mon_feature_incompat);
 }