From: Yan, Zheng Date: Tue, 17 Mar 2015 12:31:14 +0000 (+0800) Subject: mds: skip inode that is being puring when opening snap past parent X-Git-Tag: v9.0.0~150^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F3951%2Fhead;p=ceph.git mds: skip inode that is being puring when opening snap past parent we can not increase reference count of purging inodes. purging inodes have no snapshots, so it's OK to skip them. Signed-off-by: Yan, Zheng --- diff --git a/src/mds/SnapRealm.cc b/src/mds/SnapRealm.cc index 080d44c7b5c3..14af91f8f704 100644 --- a/src/mds/SnapRealm.cc +++ b/src/mds/SnapRealm.cc @@ -115,8 +115,7 @@ bool SnapRealm::_open_parents(MDSInternalContextBase *finish, snapid_t first, sn assert(srnode.past_parents.size() >= open_past_parents.size()); if (srnode.past_parents.size() > open_past_parents.size()) { for (map::iterator p = srnode.past_parents.begin(); - p != srnode.past_parents.end(); - ++p) { + p != srnode.past_parents.end(); ) { dout(10) << " past_parent [" << p->second.first << "," << p->first << "] is " << p->second.ino << dendl; CInode *parent = mdcache->get_inode(p->second.ino); @@ -126,12 +125,18 @@ bool SnapRealm::_open_parents(MDSInternalContextBase *finish, snapid_t first, sn mdcache->open_ino(p->second.ino, mdcache->mds->mdsmap->get_metadata_pool(), fin); return false; } + if (parent->state_test(CInode::STATE_PURGING)) { + dout(10) << " skip purging past_parent " << *parent << dendl; + srnode.past_parents.erase(p++); + continue; + } assert(parent->snaprealm); // hmm! if (!parent->snaprealm->_open_parents(finish, p->second.first, p->first)) return false; if (!open_past_parents.count(p->second.ino)) { add_open_past_parent(parent->snaprealm); } + ++p; } }