]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: detach unlinked inode's snaprealm from its parent
authorYan, Zheng <zyan@redhat.com>
Fri, 18 Aug 2017 11:05:51 +0000 (19:05 +0800)
committerYan, Zheng <zyan@redhat.com>
Mon, 4 Dec 2017 04:02:54 +0000 (12:02 +0800)
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" <zyan@redhat.com>
src/mds/SnapRealm.cc
src/mds/journal.cc

index 55bc49cb7318cd0490a95d1544a9b7443a4fd711..f5055a4d28d483350657ed9a820d378e9bcfa4f4 100644 (file)
@@ -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)
index f97e0eb8726a6bd7932aaa36cb5b505a3a9be993..a70de0495dc3c3a9bb724f7c0cdbf8e2e89edc92 100644 (file)
@@ -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<CInode*, CDir*>::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);
     }
   }