]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: add 'follows' of first pending snapflush to cap reconnect message
authorYan, Zheng <zyan@redhat.com>
Wed, 22 Jun 2016 07:56:29 +0000 (15:56 +0800)
committerYan, Zheng <zyan@redhat.com>
Fri, 15 Jul 2016 01:11:49 +0000 (09:11 +0800)
This helps the recovering MDS to reconstruct the internal states that
tracking pending snapflush.

Signed-off-by: Yan, Zheng <zyan@redhat.com>
src/client/Client.cc
src/mds/mdstypes.cc
src/mds/mdstypes.h
src/messages/MClientReconnect.h

index e6b5e555c990db22926a43a90db216b3e5faf2d0..12d4b3ee2a2af88aef7a5243d33e9d6823f3e758 100644 (file)
@@ -2644,19 +2644,25 @@ void Client::send_reconnect(MetaSession *session)
       cap->issue_seq = 0;  // reset seq.
       cap->mseq = 0;  // reset seq.
       cap->issued = cap->implemented;
+
+      snapid_t snap_follows = 0;
+      if (!in->cap_snaps.empty())
+       snap_follows = in->cap_snaps.begin()->first;
+
       m->add_cap(p->first.ino, 
                 cap->cap_id,
                 path.get_ino(), path.get_path(),   // ino
                 in->caps_wanted(), // wanted
                 cap->issued,     // issued
                 in->snaprealm->ino,
+                snap_follows,
                 flockbl);
 
       if (did_snaprealm.count(in->snaprealm->ino) == 0) {
        ldout(cct, 10) << " snaprealm " << *in->snaprealm << dendl;
        m->add_snaprealm(in->snaprealm->ino, in->snaprealm->seq, in->snaprealm->parent);
        did_snaprealm.insert(in->snaprealm->ino);
-      }        
+      }
     }
   }
 
index 2cc04e0439727ba6efce58f57919182597621709..1428af65f0f80dfcfad6a358ae1588b8d687c4b2 100644 (file)
@@ -996,8 +996,9 @@ void mds_load_t::generate_test_instances(list<mds_load_t*>& ls)
  * cap_reconnect_t
  */
 void cap_reconnect_t::encode(bufferlist& bl) const {
-  ENCODE_START(1, 1, bl);
+  ENCODE_START(2, 1, bl);
   encode_old(bl); // extract out when something changes
+  ::encode(snap_follows, bl);
   ENCODE_FINISH(bl);
 }
 
@@ -1011,6 +1012,8 @@ void cap_reconnect_t::encode_old(bufferlist& bl) const {
 void cap_reconnect_t::decode(bufferlist::iterator& bl) {
   DECODE_START(1, bl);
   decode_old(bl); // extract out when something changes
+  if (struct_v >= 2)
+    ::decode(snap_follows, bl);
   DECODE_FINISH(bl);
 }
 
index c69a655bf85a33957d96538b82e61d7eeb32fbe8..7039e6c05c08f4093507d5327ddbeaf0c74f884b 100644 (file)
@@ -888,13 +888,15 @@ namespace std {
 struct cap_reconnect_t {
   string path;
   mutable ceph_mds_cap_reconnect capinfo;
+  snapid_t snap_follows;
   bufferlist flockbl;
 
   cap_reconnect_t() {
     memset(&capinfo, 0, sizeof(capinfo));
+    snap_follows = 0;
   }
   cap_reconnect_t(uint64_t cap_id, inodeno_t pino, const string& p, int w, int i,
-                 inodeno_t sr, bufferlist& lb) :
+                 inodeno_t sr, snapid_t sf, bufferlist& lb) :
     path(p) {
     capinfo.cap_id = cap_id;
     capinfo.wanted = w;
@@ -902,6 +904,7 @@ struct cap_reconnect_t {
     capinfo.snaprealm = sr;
     capinfo.pathbase = pino;
     capinfo.flock_len = 0;
+    snap_follows = sf;
     flockbl.claim(lb);
   }
   void encode(bufferlist& bl) const;
index 8a9ff42f4a1c1895ac795a9de19f6560ea176af6..bfb80699d141ae826320dfeb98c858540929f5bd 100644 (file)
@@ -40,9 +40,9 @@ public:
   }
 
   void add_cap(inodeno_t ino, uint64_t cap_id, inodeno_t pathbase, const string& path,
-              int wanted, int issued, inodeno_t sr, bufferlist& lb)
+              int wanted, int issued, inodeno_t sr, snapid_t sf, bufferlist& lb)
   {
-    caps[ino] = cap_reconnect_t(cap_id, pathbase, path, wanted, issued, sr, lb);
+    caps[ino] = cap_reconnect_t(cap_id, pathbase, path, wanted, issued, sr, sf, lb);
   }
   void add_snaprealm(inodeno_t ino, snapid_t seq, inodeno_t parent) {
     ceph_mds_snaprealm_reconnect r;