]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: conditionally include flock metadata in MClientReconnect
authorSage Weil <sage@newdream.net>
Tue, 11 May 2010 20:31:19 +0000 (13:31 -0700)
committerGreg Farnum <gregf@hq.newdream.net>
Mon, 2 Aug 2010 17:39:54 +0000 (10:39 -0700)
mds: move flockbl into each reconnect record

Simpler for the client side.

mds: keep old reconnect struct

mds: put flock blob len in ceph_mds_cap_reconnect struct

encode realms the old way

src/include/ceph_fs.h
src/mds/mdstypes.h
src/messages/MClientReconnect.h

index 9247c238c25213285d0e0a5e51b35952890afc45..bd045bebc83feb9793f108522b56addb7875f6e4 100644 (file)
@@ -643,8 +643,19 @@ struct ceph_mds_cap_reconnect {
        struct ceph_timespec mtime, atime;
        __le64 snaprealm;
        __le64 pathbase;        /* base ino for our path to this ino */
+       __le32 flock_len;       /* size of flock state blob, if any */
+} __attribute__ ((packed));
+/* followed by flock blob */
+
+struct ceph_mds_cap_reconnect_v1 {
+       __le64 cap_id;
+       __le32 wanted;
+       __le32 issued;
+       __le64 size;
+       struct ceph_timespec mtime, atime;
+       __le64 snaprealm;
+       __le64 pathbase;        /* base ino for our path to this ino */
 } __attribute__ ((packed));
-/* followed by encoded string */
 
 struct ceph_mds_snaprealm_reconnect {
        __le64 ino;     /* snap realm base */
index e41c5ffe8c589f3de2adb057a00a8ac6adf4952d..16fa711bb6aae553bfbbfe831784dbf582db37bf 100644 (file)
@@ -729,7 +729,8 @@ namespace __gnu_cxx {
 // cap info for client reconnect
 struct cap_reconnect_t {
   string path;
-  ceph_mds_cap_reconnect capinfo;
+  mutable ceph_mds_cap_reconnect capinfo;
+  bufferlist flockbl;
 
   cap_reconnect_t() {}
   cap_reconnect_t(uint64_t cap_id, inodeno_t pino, const string& p, int w, int i, inodeno_t sr) : 
@@ -743,16 +744,66 @@ struct cap_reconnect_t {
 
   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);
   }
 };
 WRITE_CLASS_ENCODER(cap_reconnect_t)
 
 
+// compat for pre-FLOCK feature
+struct old_ceph_mds_cap_reconnect {
+       __le64 cap_id;
+       __le32 wanted;
+       __le32 issued;
+  __le64 old_size;
+  struct ceph_timespec old_mtime, old_atime;
+       __le64 snaprealm;
+       __le64 pathbase;        /* base ino for our path to this ino */
+} __attribute__ ((packed));
+WRITE_RAW_ENCODER(old_ceph_mds_cap_reconnect)
+
+struct old_cap_reconnect_t {
+  string path;
+  old_ceph_mds_cap_reconnect capinfo;
+
+  const old_cap_reconnect_t& operator=(const cap_reconnect_t& n) {
+    path = n.path;
+    capinfo.cap_id = n.capinfo.cap_id;
+    capinfo.wanted = n.capinfo.wanted;
+    capinfo.issued = n.capinfo.issued;
+    capinfo.snaprealm = n.capinfo.snaprealm;
+    capinfo.pathbase = n.capinfo.pathbase;
+    return *this;
+  }
+  operator cap_reconnect_t() {
+    cap_reconnect_t n;
+    n.path = path;
+    n.capinfo.cap_id = capinfo.cap_id;
+    n.capinfo.wanted = capinfo.wanted;
+    n.capinfo.issued = capinfo.issued;
+    n.capinfo.snaprealm = capinfo.snaprealm;
+    n.capinfo.pathbase = capinfo.pathbase;
+    return n;
+  }
+
+  void encode(bufferlist& bl) const {
+    ::encode(path, bl);
+    ::encode(capinfo, bl);
+  }
+  void decode(bufferlist::iterator& bl) {
+    ::decode(path, bl);
+    ::decode(capinfo, bl);
+  }
+};
+WRITE_CLASS_ENCODER(old_cap_reconnect_t)
+
 
 // ================================================================
 // dir frag
index be2472400893d35520bb3973624b5cf8c421fc38..bdde430a1f64baa0a22a59d00bb54a28e81afdca 100644 (file)
@@ -18,6 +18,7 @@
 #include "msg/Message.h"
 #include "mds/mdstypes.h"
 
+
 class MClientReconnect : public Message {
 public:
   map<inodeno_t, cap_reconnect_t>  caps;   // only head inodes
@@ -48,12 +49,31 @@ public:
   }
 
   void encode_payload() {
-    ::encode(caps, data);
+    if (connection->has_feature(CEPH_FEATURE_FLOCK)) {
+      // new protocol
+      header.version = 2;
+      ::encode(caps, data);
+    } else {
+      // compat crap
+      map<inodeno_t, old_cap_reconnect_t> ocaps;
+      for (map<inodeno_t,cap_reconnect_t>::iterator p = caps.begin(); p != caps.end(); p++)
+       ocaps[p->first] = p->second;
+      ::encode(ocaps, data);
+    }
     ::encode_nohead(realms, data);
   }
   void decode_payload() {
     bufferlist::iterator p = data.begin();
-    ::decode(caps, p);
+    if (header.version >= 2) {
+      // new protocol
+      ::decode(caps, p);
+    } else {
+      // compat crap
+      map<inodeno_t, old_cap_reconnect_t> ocaps;
+      ::decode(ocaps, p);
+      for (map<inodeno_t,old_cap_reconnect_t>::iterator q = ocaps.begin(); q != ocaps.end(); q++)
+       caps[q->first] = q->second;
+    }
     while (p.end()) {
       realms.push_back(ceph_mds_snaprealm_reconnect());
       ::decode(realms.back(), p);