From b3fdf158882d00d08b7097abdfbee125be81f5f8 Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Mon, 19 Jan 2015 13:48:38 +0800 Subject: [PATCH] mds: avoid propagrating unnecessary snap rstat to parent if parent is not snapshotted, avoid propagrating snap rstat to it Signed-off-by: Yan, Zheng --- src/mds/CDir.cc | 2 +- src/mds/MDCache.cc | 22 +++++++++++++++++++--- src/mds/MDCache.h | 3 ++- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/mds/CDir.cc b/src/mds/CDir.cc index db6e5567955..235b0dd8cb2 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 f271b586f2c..f62afae4e4a 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 c28cc9d397d..c31ffdbd2a6 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, -- 2.47.3