]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: avoid propagrating unnecessary snap rstat to parent 3468/head
authorYan, Zheng <zyan@redhat.com>
Mon, 19 Jan 2015 05:48:38 +0000 (13:48 +0800)
committerYan, Zheng <zyan@redhat.com>
Thu, 5 Feb 2015 14:40:39 +0000 (22:40 +0800)
if parent is not snapshotted, avoid propagrating snap rstat to it

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

index db6e5567955b478e9bd1cb3e2892ae7bf1584672..235b0dd8cb23aabb757a3148a7a44ebd800ff162 100644 (file)
@@ -1108,7 +1108,7 @@ void CDir::assimilate_dirty_rstat_inodes()
     inode_t *pi = in->project_inode();
     pi->version = in->pre_dirty();
 
-    inode->mdcache->project_rstat_inode_to_frag(in, this, 0, 0);
+    inode->mdcache->project_rstat_inode_to_frag(in, this, 0, 0, NULL);
   }
   state_set(STATE_ASSIMRSTAT);
   dout(10) << "assimilate_dirty_rstat_inodes done" << dendl;
index f271b586f2c420b9cb9a0aeb6cf68c60297ec1bb..f62afae4e4ab0e326ba93fec4a92201362230776 100644 (file)
@@ -1683,7 +1683,8 @@ void MDCache::journal_dirty_inode(MutationImpl *mut, EMetaBlob *metablob, CInode
 
 // nested ---------------------------------------------------------------
 
-void MDCache::project_rstat_inode_to_frag(CInode *cur, CDir *parent, snapid_t first, int linkunlink)
+void MDCache::project_rstat_inode_to_frag(CInode *cur, CDir *parent, snapid_t first,
+                                         int linkunlink, SnapRealm *prealm)
 {
   CDentry *parentdn = cur->get_projected_parent_dn();
   inode_t *curi = cur->get_projected_inode();
@@ -1704,6 +1705,17 @@ void MDCache::project_rstat_inode_to_frag(CInode *cur, CDir *parent, snapid_t fi
   snapid_t floor = parentdn->first;
   dout(20) << " floor of " << floor << " from parent dn " << *parentdn << dendl;
 
+  if (!prealm)
+      prealm = parent->inode->find_snaprealm();
+  const set<snapid_t> snaps = prealm->get_snaps();
+
+  if (cur->last != CEPH_NOSNAP) {
+    assert(cur->dirty_old_rstats.empty());
+    set<snapid_t>::const_iterator q = snaps.lower_bound(MAX(first, floor));
+    if (q == snaps.end() || *q > cur->last)
+      return;
+  }
+
   if (cur->last >= floor)
     _project_rstat_inode_to_frag(*curi, MAX(first, floor), cur->last, parent, linkunlink);
       
@@ -1711,8 +1723,12 @@ void MDCache::project_rstat_inode_to_frag(CInode *cur, CDir *parent, snapid_t fi
        p != cur->dirty_old_rstats.end();
        ++p) {
     old_inode_t& old = cur->old_inodes[*p];
+    snapid_t ofirst = MAX(old.first, floor);
+    set<snapid_t>::const_iterator q = snaps.lower_bound(ofirst);
+    if (q == snaps.end() || *q > *p)
+      continue;
     if (*p >= floor)
-      _project_rstat_inode_to_frag(old.inode, MAX(old.first, floor), *p, parent);
+      _project_rstat_inode_to_frag(old.inode, ofirst, *p, parent, 0);
   }
   cur->dirty_old_rstats.clear();
 }
@@ -2106,7 +2122,7 @@ void MDCache::predirty_journal_parents(MutationRef mut, EMetaBlob *blob,
       parent->resync_accounted_rstat();
 
       // now push inode rstats into frag
-      project_rstat_inode_to_frag(cur, parent, first, linkunlink);
+      project_rstat_inode_to_frag(cur, parent, first, linkunlink, prealm);
       cur->clear_dirty_rstat();
     }
 
index c28cc9d397dd6a667bf0b64873396d2008b16db3..c31ffdbd2a6ee3ee17508a2491290272b8ed1e3e 100644 (file)
@@ -311,7 +311,8 @@ public:
                          CInode **pcow_inode=0);
   void journal_dirty_inode(MutationImpl *mut, EMetaBlob *metablob, CInode *in, snapid_t follows=CEPH_NOSNAP);
 
-  void project_rstat_inode_to_frag(CInode *cur, CDir *parent, snapid_t first, int linkunlink);
+  void project_rstat_inode_to_frag(CInode *cur, CDir *parent, snapid_t first,
+                                  int linkunlink, SnapRealm *prealm);
   void _project_rstat_inode_to_frag(inode_t& inode, snapid_t ofirst, snapid_t last,
                                    CDir *parent, int linkunlink=0);
   void project_rstat_frag_to_inode(nest_info_t& rstat, nest_info_t& accounted_rstat,