]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: conditionally encode PGMap[::Incremental] with quorum features
authorSage Weil <sage@inktank.com>
Thu, 21 Jun 2012 14:23:56 +0000 (07:23 -0700)
committerSamuel Just <sam.just@inktank.com>
Fri, 22 Jun 2012 00:10:30 +0000 (17:10 -0700)
This allows a mon cluster to transition to the new encoding during a
rolling upgrade.

Signed-off-by: Sage Weil <sage@inktank.com>
src/mon/PGMap.cc
src/mon/PGMap.h
src/mon/PGMonitor.cc

index b6c2dd99e9d581594cb14e63b4a202777b11839e..1382e186929e03ec8016a43ca46e948f82712a35 100644 (file)
@@ -7,11 +7,27 @@
 #include "common/debug.h"
 
 #include "common/Formatter.h"
+#include "include/ceph_features.h"
 
 // --
 
-void PGMap::Incremental::encode(bufferlist &bl) const
+void PGMap::Incremental::encode(bufferlist &bl, uint64_t features) const
 {
+  if ((features & CEPH_FEATURE_MONENC) == 0) {
+    __u8 v = 4;
+    ::encode(v, bl);
+    ::encode(version, bl);
+    ::encode(pg_stat_updates, bl);
+    ::encode(osd_stat_updates, bl);
+    ::encode(osd_stat_rm, bl);
+    ::encode(osdmap_epoch, bl);
+    ::encode(pg_scan, bl);
+    ::encode(full_ratio, bl);
+    ::encode(nearfull_ratio, bl);
+    ::encode(pg_remove, bl);
+    return;
+  }
+
   ENCODE_START(5, 5, bl);
   ::encode(version, bl);
   ::encode(pg_stat_updates, bl);
@@ -312,8 +328,21 @@ epoch_t PGMap::calc_min_last_epoch_clean() const
   return min;
 }
 
-void PGMap::encode(bufferlist &bl) const
+void PGMap::encode(bufferlist &bl, uint64_t features) const
 {
+  if ((features & CEPH_FEATURE_MONENC) == 0) {
+    __u8 v = 3;
+    ::encode(v, bl);
+    ::encode(version, bl);
+    ::encode(pg_stat, bl);
+    ::encode(osd_stat, bl);
+    ::encode(last_osdmap_epoch, bl);
+    ::encode(last_pg_scan, bl);
+    ::encode(full_ratio, bl);
+    ::encode(nearfull_ratio, bl);
+    return;
+  }
+
   ENCODE_START(4, 4, bl);
   ::encode(version, bl);
   ::encode(pg_stat, bl);
index d6b93278576833edc2d5d0a9b82e0f201374a919..46d057c6335ca5cc86c4a0377645be275c47eb08 100644 (file)
@@ -53,7 +53,7 @@ public:
     float full_ratio;
     float nearfull_ratio;
 
-    void encode(bufferlist &bl) const;
+    void encode(bufferlist &bl, uint64_t features=-1) const;
     void decode(bufferlist::iterator &bl);
     void dump(Formatter *f) const;
     static void generate_test_instances(list<Incremental*>& o);
@@ -95,7 +95,7 @@ public:
   void stat_osd_add(const osd_stat_t &s);
   void stat_osd_sub(const osd_stat_t &s);
   
-  void encode(bufferlist &bl) const;
+  void encode(bufferlist &bl, uint64_t features=-1) const;
   void decode(bufferlist::iterator &bl);
 
   void dump(Formatter *f) const; 
@@ -121,8 +121,8 @@ public:
 
   static void generate_test_instances(list<PGMap*>& o);
 };
-WRITE_CLASS_ENCODER(PGMap::Incremental)
-WRITE_CLASS_ENCODER(PGMap)
+WRITE_CLASS_ENCODER_FEATURES(PGMap::Incremental)
+WRITE_CLASS_ENCODER_FEATURES(PGMap)
 
 inline ostream& operator<<(ostream& out, const PGMap& m) {
   m.print_summary(out);
index 595dfd4b564ce4db22416a81513143124cac9a02..a5592c4f66af83606145f129c3320dada5a03bb1 100644 (file)
@@ -197,7 +197,7 @@ void PGMonitor::update_from_paxos()
 
   // save latest
   bufferlist bl;
-  pg_map.encode(bl);
+  pg_map.encode(bl, mon->get_quorum_features());
   paxos->stash_latest(paxosv, bl);
 
   // dump pgmap summaries?  (useful for debugging)
@@ -257,7 +257,7 @@ void PGMonitor::encode_pending(bufferlist &bl)
 {
   dout(10) << "encode_pending v " << pending_inc.version << dendl;
   assert(paxos->get_version() + 1 == pending_inc.version);
-  pending_inc.encode(bl);
+  pending_inc.encode(bl, mon->get_quorum_features());
 }
 
 bool PGMonitor::preprocess_query(PaxosServiceMessage *m)