]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: cap_reconnect_t uses modern encoding
authorGreg Farnum <greg@inktank.com>
Thu, 31 Jan 2013 17:07:08 +0000 (09:07 -0800)
committerGreg Farnum <greg@inktank.com>
Fri, 8 Feb 2013 21:58:41 +0000 (13:58 -0800)
Signed-off-by: Greg Farnum <greg@inktank.com>
src/mds/mdstypes.cc
src/mds/mdstypes.h
src/messages/MClientReconnect.h
src/test/encoding/types.h

index e9da4839982f5e65f649293701569e11995ffebc..6b87c221e56dbc3ccd75aac1d63c204244a7c98b 100644 (file)
@@ -844,3 +844,49 @@ void mds_load_t::generate_test_instances(list<mds_load_t*>& ls)
   utime_t sample;
   ls.push_back(new mds_load_t(sample));
 }
+
+/*
+ * cap_reconnect_t
+ */
+void cap_reconnect_t::encode(bufferlist& bl) const {
+  ENCODE_START(1, 1, bl);
+  encode_old(bl); // extract out when something changes
+  ENCODE_FINISH(bl);
+}
+
+void cap_reconnect_t::encode_old(bufferlist& bl) const {
+  ::encode(path, bl);
+  capinfo.flock_len = flockbl.length();
+  ::encode(capinfo, bl);
+  ::encode_nohead(flockbl, bl);
+}
+
+void cap_reconnect_t::decode(bufferlist::iterator& bl) {
+  DECODE_START(1, bl);
+  decode_old(bl); // extract out when something changes
+  DECODE_FINISH(bl);
+}
+
+void cap_reconnect_t::decode_old(bufferlist::iterator& bl) {
+  ::decode(path, bl);
+  ::decode(capinfo, bl);
+  ::decode_nohead(capinfo.flock_len, flockbl, bl);
+}
+
+void cap_reconnect_t::dump(Formatter *f) const
+{
+  f->dump_string("path", path);
+  f->dump_int("cap_id", capinfo.cap_id);
+  f->dump_string("cap wanted", ccap_string(capinfo.wanted));
+  f->dump_string("cap issued", ccap_string(capinfo.issued));
+  f->dump_int("snaprealm", capinfo.snaprealm);
+  f->dump_int("path base ino", capinfo.pathbase);
+  f->dump_string("has file locks", capinfo.flock_len ? "true" : "false");
+}
+
+void cap_reconnect_t::generate_test_instances(list<cap_reconnect_t*>& ls)
+{
+  ls.push_back(new cap_reconnect_t);
+  ls.back()->path = "/test/path";
+  ls.back()->capinfo.cap_id = 1;
+}
index ecb1ee95cbbe1cbcbbf32985b27709640a49f29a..8670663ae4b93cc3992b566bb969c66ef30f8a0c 100644 (file)
@@ -692,18 +692,13 @@ struct cap_reconnect_t {
     capinfo.pathbase = pino;
     capinfo.flock_len = 0;
   }
+  void encode(bufferlist& bl) const;
+  void decode(bufferlist::iterator& bl);
+  void encode_old(bufferlist& bl) const;
+  void decode_old(bufferlist::iterator& bl);
 
-  void encode(bufferlist& bl) const {
-    ::encode(path, bl);
-    capinfo.flock_len = flockbl.length();
-    ::encode(capinfo, bl);
-    ::encode_nohead(flockbl, bl);
-  }
-  void decode(bufferlist::iterator& bl) {
-    ::decode(path, bl);
-    ::decode(capinfo, bl);
-    ::decode_nohead(capinfo.flock_len, flockbl, bl);
-  }
+  void dump(Formatter *f) const;
+  static void generate_test_instances(list<cap_reconnect_t*>& ls);
 };
 WRITE_CLASS_ENCODER(cap_reconnect_t)
 
index 400159c6db649f9314960984246c923131ddf3e1..f7d6ac9897dd62ca24f42cf148a5e62e1dc4bc1b 100644 (file)
@@ -22,7 +22,7 @@
 
 class MClientReconnect : public Message {
 
-  const static int HEAD_VERSION = 2;
+  const static int HEAD_VERSION = 3;
 
 public:
   map<inodeno_t, cap_reconnect_t>  caps;   // only head inodes
@@ -53,9 +53,17 @@ public:
   }
 
   void encode_payload(uint64_t features) {
-    if (features & CEPH_FEATURE_FLOCK) {
-      // new protocol
+    if (features & CEPH_FEATURE_MDSENC) {
       ::encode(caps, data);
+    } else if (features & CEPH_FEATURE_FLOCK) {
+      // encode with old cap_reconnect_t encoding
+      __u32 n = caps.size();
+      ::encode(n, data);
+      for (map<inodeno_t,cap_reconnect_t>::iterator p = caps.begin(); p != caps.end(); ++p) {
+       ::encode(p->first, data);
+       p->second.encode_old(data);
+      }
+      header.version = 2;
     } else {
       // compat crap
       header.version = 1;
@@ -68,9 +76,17 @@ public:
   }
   void decode_payload() {
     bufferlist::iterator p = data.begin();
-    if (header.version >= 2) {
+    if (header.version >= 3) {
       // new protocol
       ::decode(caps, p);
+    } else if (header.version == 2) {
+      __u32 n;
+      ::decode(n, p);
+      inodeno_t ino;
+      while (n--) {
+       ::decode(ino, p);
+       caps[ino].decode_old(p);
+      }
     } else {
       // compat crap
       map<inodeno_t, old_cap_reconnect_t> ocaps;
index 799231a39f01c63735cb716b66a221f16ac53bce..0979542e8f412c5d67608ca62cd94dca040d5434 100644 (file)
@@ -115,6 +115,7 @@ TYPE(mds_table_pending_t)
 TYPE(inode_load_vec_t)
 TYPE(dirfrag_load_vec_t)
 TYPE(mds_load_t)
+TYPE(cap_reconnect_t)
 
 #include "mds/MDSMap.h"
 TYPE_FEATUREFUL(MDSMap)