]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: forbid discovering purging inode
authorYan, Zheng <zyan@redhat.com>
Wed, 19 Apr 2017 09:22:39 +0000 (17:22 +0800)
committerYan, Zheng <zyan@redhat.com>
Thu, 11 May 2017 06:13:24 +0000 (14:13 +0800)
Signed-off-by: "Yan, Zheng" <zyan@redhat.com>
src/mds/MDCache.cc

index af6152bf45dd8fbf123003db88809103c4146e1a..f569517a0166f3dc8cb24d9b5cf1a46b1b56595a 100644 (file)
@@ -9854,15 +9854,15 @@ void MDCache::handle_discover(MDiscover *dis)
       curdir = cur->get_or_open_dirfrag(this, fg);
     } else if (curdir->is_frozen_tree() ||
               (curdir->is_frozen_dir() && fragment_are_all_frozen(curdir))) {
+      if (!reply->is_empty()) {
+       dout(7) << *curdir << " is frozen, non-empty reply, stopping" << dendl;
+       break;
+      }
       if (dis->wants_base_dir() && dis->get_base_dir_frag() != curdir->get_frag()) {
        dout(7) << *curdir << " is frozen, dirfrag mismatch, stopping" << dendl;
        reply->set_flag_error_dir();
        break;
       }
-      if (!reply->is_empty()) {
-       dout(7) << *curdir << " is frozen, non-empty reply, stopping" << dendl;
-       break;
-      }
       dout(7) << *curdir << " is frozen, empty reply, waiting" << dendl;
       curdir->add_waiter(CDir::WAIT_UNFREEZE, new C_MDS_RetryMessage(mds, dis));
       reply->put();
@@ -9922,6 +9922,13 @@ void MDCache::handle_discover(MDiscover *dis)
     }
     assert(dn);
 
+    // don't add replica to purging dentry/inode
+    if (dn->state_test(CDentry::STATE_PURGING)) {
+      if (reply->is_empty())
+       reply->set_flag_error_dn(dis->get_dentry(i));
+      break;
+    }
+
     CDentry::linkage_t *dnl = dn->get_linkage();
 
     // xlocked dentry?
@@ -10117,6 +10124,17 @@ void MDCache::handle_discover_reply(MDiscoverReply *m)
        dout(7) << " doing nothing, have dir but nobody is waiting on dentry "
                << m->get_error_dentry() << dendl;
     }
+  } else if (m->is_flag_error_dn()) {
+    frag_t fg = cur->pick_dirfrag(m->get_error_dentry());
+    CDir *dir = cur->get_dirfrag(fg);
+    if (dir) {
+      if (dir->is_auth()) {
+       dir->take_sub_waiting(finished);
+      } else {
+       dir->take_dentry_waiting(m->get_error_dentry(), m->get_wanted_snapid(),
+                                m->get_wanted_snapid(), error);
+      }
+    }
   }
 
   // waiters