From: Yan, Zheng Date: Mon, 19 Jan 2015 05:48:38 +0000 (+0800) Subject: mds: avoid propagrating unnecessary snap rstat to parent X-Git-Tag: v0.93~87^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=b3fdf158882d00d08b7097abdfbee125be81f5f8;p=ceph.git mds: avoid propagrating unnecessary snap rstat to parent if parent is not snapshotted, avoid propagrating snap rstat to it Signed-off-by: Yan, Zheng --- diff --git a/src/mds/CDir.cc b/src/mds/CDir.cc index db6e5567955b..235b0dd8cb23 100644 --- a/src/mds/CDir.cc +++ b/src/mds/CDir.cc @@ -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; diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index f271b586f2c4..f62afae4e4ab 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -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 snaps = prealm->get_snaps(); + + if (cur->last != CEPH_NOSNAP) { + assert(cur->dirty_old_rstats.empty()); + set::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::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(); } diff --git a/src/mds/MDCache.h b/src/mds/MDCache.h index c28cc9d397dd..c31ffdbd2a6e 100644 --- a/src/mds/MDCache.h +++ b/src/mds/MDCache.h @@ -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,