]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
mds: properly update client_snap_caps when splitting snap inode
authorYan, Zheng <zyan@redhat.com>
Tue, 21 Jun 2016 08:20:58 +0000 (16:20 +0800)
committerYan, Zheng <zyan@redhat.com>
Fri, 15 Jul 2016 01:11:49 +0000 (09:11 +0800)
update the new snap inode's client_snap_caps according to the old
snap inode.

Signed-off-by: Yan, Zheng <zyan@redhat.com>
src/mds/CInode.cc
src/mds/CInode.h
src/mds/MDCache.cc

index 326fe35995b9c5a8b6b071f93f885446cfa0286a..12b1a9d9480cdd2271156805d0fc8d236dbdee0a 100644 (file)
@@ -311,20 +311,23 @@ void CInode::remove_need_snapflush(CInode *snapin, snapid_t snapid, client_t cli
   }
 }
 
-void CInode::split_need_snapflush(CInode *cowin, CInode *in)
+bool CInode::split_need_snapflush(CInode *cowin, CInode *in)
 {
   dout(10) << "split_need_snapflush [" << cowin->first << "," << cowin->last << "] for " << *cowin << dendl;
+  bool need_flush = false;
   for (compact_map<snapid_t, set<client_t> >::iterator p = client_need_snapflush.lower_bound(cowin->first);
        p != client_need_snapflush.end() && p->first < in->first; ) {
     compact_map<snapid_t, set<client_t> >::iterator q = p;
     ++p;
     assert(!q->second.empty());
-    if (cowin->last >= q->first)
+    if (cowin->last >= q->first) {
       cowin->auth_pin(this);
-    else
+      need_flush = true;
+    } else
       client_need_snapflush.erase(q);
     in->auth_unpin(this);
   }
+  return need_flush;
 }
 
 void CInode::mark_dirty_rstat()
index 21686a2e080f9df11d252f389214bbf25303fc9d..b4d9ba0602c81aed7c5a90d41a67d4d9640191fa 100644 (file)
@@ -566,7 +566,7 @@ public:
 
   void add_need_snapflush(CInode *snapin, snapid_t snapid, client_t client);
   void remove_need_snapflush(CInode *snapin, snapid_t snapid, client_t client);
-  void split_need_snapflush(CInode *cowin, CInode *in);
+  bool split_need_snapflush(CInode *cowin, CInode *in);
 
 protected:
 
index 1830b8f73d4add84e1ed8e2013e25132c1b202c6..b71e1d4a699ca25372cd9d37551d7cc8e75b3aed 100644 (file)
@@ -1546,7 +1546,21 @@ CInode *MDCache::cow_inode(CInode *in, snapid_t last)
   if (in->last != CEPH_NOSNAP) {
     CInode *head_in = get_inode(in->ino());
     assert(head_in);
-    head_in->split_need_snapflush(oldin, in);
+    if (head_in->split_need_snapflush(oldin, in)) {
+      oldin->client_snap_caps = in->client_snap_caps;
+      for (compact_map<int,set<client_t> >::iterator p = in->client_snap_caps.begin();
+          p != in->client_snap_caps.end();
+          ++p) {
+       SimpleLock *lock = oldin->get_lock(p->first);
+       assert(lock);
+       for (auto q = p->second.begin(); q != p->second.end(); ++q) {
+         oldin->auth_pin(lock);
+         lock->set_state(LOCK_SNAP_SYNC);  // gathering
+         lock->get_wrlock(true);
+       }
+      }
+    }
+    return oldin;
   }
 
   // clone caps?