From 233fb368784814b3aaa2867969741dc931178e45 Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Thu, 13 Apr 2017 19:36:56 +0800 Subject: [PATCH] mds: drop dirty dentries in subtree of deleted directory Make slave commit code of rename/rmdir drop dirty dentries in subtree dirfrag of deleted directory. Signed-off-by: "Yan, Zheng" --- src/mds/MDCache.cc | 11 +++++++++++ src/mds/MDCache.h | 2 ++ src/mds/Server.cc | 22 +++++++++++++++++----- src/mds/Server.h | 2 +- src/mds/StrayManager.cc | 8 +------- 5 files changed, 32 insertions(+), 13 deletions(-) diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index f157e097a10..90835a8472f 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -12373,3 +12373,14 @@ void MDCache::maybe_eval_stray(CInode *in, bool delay) { } } +void MDCache::clear_dirty_bits_for_stray(CInode* diri) { + dout(10) << __func__ << " " << *diri << dendl; + assert(diri->get_projected_parent_dir()->inode->is_stray()); + list ls; + diri->get_dirfrags(ls); + for (auto p : ls) { + if (p->is_auth() && !(p->is_frozen() || p->is_freezing())) + p->try_remove_dentries_for_stray(); + } +} + diff --git a/src/mds/MDCache.h b/src/mds/MDCache.h index 3e46cb1a007..6447b009145 100644 --- a/src/mds/MDCache.h +++ b/src/mds/MDCache.h @@ -155,6 +155,8 @@ public: } void maybe_eval_stray(CInode *in, bool delay=false); + void clear_dirty_bits_for_stray(CInode* diri); + bool is_readonly() { return readonly; } void force_readonly(); diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 008beb4d24d..6943f80ac2c 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -5858,10 +5858,11 @@ struct C_MDS_SlaveRmdirPrep : public ServerLogContext { struct C_MDS_SlaveRmdirCommit : public ServerContext { MDRequestRef mdr; - C_MDS_SlaveRmdirCommit(Server *s, MDRequestRef& r) - : ServerContext(s), mdr(r) { } + CDentry *straydn; + C_MDS_SlaveRmdirCommit(Server *s, MDRequestRef& r, CDentry *sd) + : ServerContext(s), mdr(r), straydn(sd) { } void finish(int r) override { - server->_commit_slave_rmdir(mdr, r); + server->_commit_slave_rmdir(mdr, r, straydn); } }; @@ -5904,7 +5905,7 @@ void Server::handle_slave_rmdir_prep(MDRequestRef& mdr) dout(20) << " rollback is " << mdr->more()->rollback_bl.length() << " bytes" << dendl; // set up commit waiter - mdr->more()->slave_commit = new C_MDS_SlaveRmdirCommit(this, mdr); + mdr->more()->slave_commit = new C_MDS_SlaveRmdirCommit(this, mdr, straydn); if (!in->has_subtree_root_dirfrag(mds->get_nodeid())) { dout(10) << " no auth subtree in " << *in << ", skipping journal" << dendl; @@ -6005,11 +6006,17 @@ void Server::handle_slave_rmdir_prep_ack(MDRequestRef& mdr, MMDSSlaveRequest *ac dout(10) << "still waiting on slaves " << mdr->more()->waiting_on_slave << dendl; } -void Server::_commit_slave_rmdir(MDRequestRef& mdr, int r) +void Server::_commit_slave_rmdir(MDRequestRef& mdr, int r, CDentry *straydn) { dout(10) << "_commit_slave_rmdir " << *mdr << " r=" << r << dendl; if (r == 0) { + if (mdr->more()->slave_update_journaled) { + CInode *strayin = straydn->get_projected_linkage()->get_inode(); + if (strayin && !strayin->snaprealm) + mdcache->clear_dirty_bits_for_stray(strayin); + } + mdr->cleanup(); if (mdr->more()->slave_update_journaled) { @@ -7565,6 +7572,11 @@ void Server::_commit_slave_rename(MDRequestRef& mdr, int r, mdr->more()->is_ambiguous_auth = false; } + if (straydn && mdr->more()->slave_update_journaled) { + CInode *strayin = straydn->get_projected_linkage()->get_inode(); + if (strayin && !strayin->snaprealm) + mdcache->clear_dirty_bits_for_stray(strayin); + } mds->queue_waiters(finished); mdr->cleanup(); diff --git a/src/mds/Server.h b/src/mds/Server.h index bf6e05bae00..094c67296ad 100644 --- a/src/mds/Server.h +++ b/src/mds/Server.h @@ -232,7 +232,7 @@ public: bool _rmdir_prepare_witness(MDRequestRef& mdr, mds_rank_t who, vector& trace, CDentry *straydn); void handle_slave_rmdir_prep(MDRequestRef& mdr); void _logged_slave_rmdir(MDRequestRef& mdr, CDentry *srcdn, CDentry *straydn); - void _commit_slave_rmdir(MDRequestRef& mdr, int r); + void _commit_slave_rmdir(MDRequestRef& mdr, int r, CDentry *straydn); void handle_slave_rmdir_prep_ack(MDRequestRef& mdr, MMDSSlaveRequest *ack); void do_rmdir_rollback(bufferlist &rbl, mds_rank_t master, MDRequestRef& mdr); void _rmdir_rollback_finish(MDRequestRef& mdr, metareqid_t reqid, CDentry *dn, CDentry *straydn); diff --git a/src/mds/StrayManager.cc b/src/mds/StrayManager.cc index 8b239ea5bea..34ba18679ec 100644 --- a/src/mds/StrayManager.cc +++ b/src/mds/StrayManager.cc @@ -468,13 +468,7 @@ bool StrayManager::_eval_stray(CDentry *dn, bool delay) return false; // not until some snaps are deleted. } - if (in->has_dirfrags()) { - list ls; - in->get_nested_dirfrags(ls); - for (list::iterator p = ls.begin(); p != ls.end(); ++p) { - (*p)->try_remove_dentries_for_stray(); - } - } + in->mdcache->clear_dirty_bits_for_stray(in); if (!in->remote_parents.empty()) { // unlink any stale remote snap dentry. -- 2.47.3