]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: make pool_snap_info_t encoding backward compatible
authorSage Weil <sage@inktank.com>
Mon, 29 Oct 2012 18:03:46 +0000 (11:03 -0700)
committerSage Weil <sage@inktank.com>
Mon, 29 Oct 2012 18:05:59 +0000 (11:05 -0700)
Way back in fc869dee1e8a1c90c93cb7e678563772fb1c51fb (v0.42) when we redid
the osd type encoding we forgot to make this conditionally encode the old
format for old clients.  In particular, this means that kernel clients
will fail to decode the osdmap if there is a rados pool with a pool-level
snapshot defined.

Fixes: #3290
Signed-off-by: Sage Weil <sage@inktank.com>
src/include/encoding.h
src/osd/osd_types.cc
src/osd/osd_types.h
src/test/encoding/types.h

index 0b15dcd3361e799b5041a7efeec7e07a8f594152..db5d19658cf1efa8213947f7f1e5e872a7b3b2be 100644 (file)
@@ -569,6 +569,14 @@ inline void encode_nohead(const std::map<T,U>& m, bufferlist& bl)
   }
 }
 template<class T, class U>
+inline void encode_nohead(const std::map<T,U>& m, bufferlist& bl, uint64_t features)
+{
+  for (typename std::map<T,U>::const_iterator p = m.begin(); p != m.end(); ++p) {
+    encode(p->first, bl, features);
+    encode(p->second, bl, features);
+  }
+}
+template<class T, class U>
 inline void decode_nohead(int n, std::map<T,U>& m, bufferlist::iterator& p)
 {
   m.clear();
index 5597c0249829a4cf082ee06c9d1b3fb86b480b36..4abcdb434d49357f4fef47d17d89ce003179c445 100644 (file)
@@ -443,8 +443,16 @@ void pool_snap_info_t::dump(Formatter *f) const
   f->dump_string("name", name);
 }
 
-void pool_snap_info_t::encode(bufferlist& bl) const
+void pool_snap_info_t::encode(bufferlist& bl, uint64_t features) const
 {
+  if ((features & CEPH_FEATURE_PGPOOL3) == 0) {
+    __u8 struct_v = 1;
+    ::encode(struct_v, bl);
+    ::encode(snapid, bl);
+    ::encode(stamp, bl);
+    ::encode(name, bl);
+    return;
+  }
   ENCODE_START(2, 2, bl);
   ::encode(snapid, bl);
   ::encode(stamp, bl);
@@ -659,7 +667,7 @@ void pg_pool_t::encode(bufferlist& bl, uint64_t features) const
 
     ::encode(auid, bl);
 
-    ::encode_nohead(snaps, bl);
+    ::encode_nohead(snaps, bl, features);
     removed_snaps.encode_nohead(bl);
     return;
   }
@@ -679,7 +687,7 @@ void pg_pool_t::encode(bufferlist& bl, uint64_t features) const
     ::encode(last_change, bl);
     ::encode(snap_seq, bl);
     ::encode(snap_epoch, bl);
-    ::encode(snaps, bl);
+    ::encode(snaps, bl, features);
     ::encode(removed_snaps, bl);
     ::encode(auid, bl);
     ::encode(flags, bl);
@@ -700,7 +708,7 @@ void pg_pool_t::encode(bufferlist& bl, uint64_t features) const
   ::encode(last_change, bl);
   ::encode(snap_seq, bl);
   ::encode(snap_epoch, bl);
-  ::encode(snaps, bl);
+  ::encode(snaps, bl, features);
   ::encode(removed_snaps, bl);
   ::encode(auid, bl);
   ::encode(flags, bl);
index 503a514406e181301342faff3baca750490f5b8a..7c1aad1d77e8706369f1392e0fbd756c6fa3bbb7 100644 (file)
@@ -589,11 +589,11 @@ struct pool_snap_info_t {
   string name;
 
   void dump(Formatter *f) const;
-  void encode(bufferlist& bl) const;
+  void encode(bufferlist& bl, uint64_t features) const;
   void decode(bufferlist::iterator& bl);
   static void generate_test_instances(list<pool_snap_info_t*>& o);
 };
-WRITE_CLASS_ENCODER(pool_snap_info_t)
+WRITE_CLASS_ENCODER_FEATURES(pool_snap_info_t)
 
 inline ostream& operator<<(ostream& out, const pool_snap_info_t& si) {
   return out << si.snapid << '(' << si.name << ' ' << si.stamp << ')';
index 6633466953ff602643f4f5e635c6442e24ada8b0..9993aa3b550257e2c14f7b39c87693a01273e57c 100644 (file)
@@ -36,7 +36,7 @@ TYPE(pg_t)
 TYPE(coll_t)
 TYPE(osd_stat_t)
 TYPE(OSDSuperblock)
-TYPE(pool_snap_info_t)
+TYPE_FEATUREFUL(pool_snap_info_t)
 TYPE_FEATUREFUL(pg_pool_t)
 TYPE(object_stat_sum_t)
 TYPE(object_stat_collection_t)