From 5d4b4404306cd60a5e6c7f292296ee66fd5eeafd Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Fri, 18 Aug 2017 19:05:51 +0800 Subject: [PATCH] mds: detach unlinked inode's snaprealm from its parent When replaying slave update, inode may gets unlinked, but preserved in memory in case of rollback. In this case, we need to detach the inode's snaprealm from its parent. Signed-off-by: "Yan, Zheng" --- src/mds/SnapRealm.cc | 3 ++- src/mds/journal.cc | 11 +++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/mds/SnapRealm.cc b/src/mds/SnapRealm.cc index 55bc49cb731..f5055a4d28d 100644 --- a/src/mds/SnapRealm.cc +++ b/src/mds/SnapRealm.cc @@ -415,7 +415,8 @@ snapid_t SnapRealm::resolve_snapname(const string& n, inodeno_t atino, snapid_t void SnapRealm::adjust_parent() { - SnapRealm *newparent = inode->get_parent_dn()->get_dir()->get_inode()->find_snaprealm(); + CDentry *pdn = inode->get_parent_dn(); + SnapRealm *newparent = pdn ? pdn->get_dir()->get_inode()->find_snaprealm() : NULL; if (newparent != parent) { dout(10) << "adjust_parent " << parent << " -> " << newparent << dendl; if (parent) diff --git a/src/mds/journal.cc b/src/mds/journal.cc index f97e0eb8726..a70de0495dc 100644 --- a/src/mds/journal.cc +++ b/src/mds/journal.cc @@ -1502,10 +1502,13 @@ void EMetaBlob::replay(MDSRank *mds, LogSegment *logseg, MDSlaveUpdate *slaveup) unlinked.erase(*p); dout(10) << " unlinked set contains " << unlinked << dendl; for (map::iterator p = unlinked.begin(); p != unlinked.end(); ++p) { - if (slaveup) // preserve unlinked inodes until slave commit - slaveup->unlinked.insert(p->first); - else - mds->mdcache->remove_inode_recursive(p->first); + CInode *in = p->first; + if (slaveup) { // preserve unlinked inodes until slave commit + slaveup->unlinked.insert(in); + if (in->snaprealm) + in->snaprealm->adjust_parent(); + } else + mds->mdcache->remove_inode_recursive(in); } } -- 2.39.5