From: Yan, Zheng Date: Wed, 19 Apr 2017 09:22:39 +0000 (+0800) Subject: mds: forbid discovering purging inode X-Git-Tag: v12.1.0~10^2~28^2~8 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=e4db99a232fc23a41f150d50bd714d865f154e91;p=ceph.git mds: forbid discovering purging inode Signed-off-by: "Yan, Zheng" --- diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index af6152bf45dd..f569517a0166 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -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