From 21bbdf5dd974839dc538750406554d0de6237742 Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Wed, 30 Apr 2014 18:30:25 +0800 Subject: [PATCH] mds: avoid adding replicas of target dentry to rename witnesses When the rename target dentry is NULL, we can use MDentryLink messages instead of slave requests to update its replicas. Signed-off-by: Yan, Zheng --- src/mds/MDCache.cc | 7 +++++-- src/mds/MDCache.h | 2 +- src/mds/Server.cc | 28 +++++++++++++++++----------- 3 files changed, 23 insertions(+), 14 deletions(-) diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 49f33080f5bf5..f90a5c45aab95 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -10808,7 +10808,7 @@ void MDCache::handle_dir_update(MDirUpdate *m) // LINK -void MDCache::send_dentry_link(CDentry *dn) +void MDCache::send_dentry_link(CDentry *dn, MDRequestRef& mdr) { dout(7) << "send_dentry_link " << *dn << dendl; @@ -10816,6 +10816,9 @@ void MDCache::send_dentry_link(CDentry *dn) for (map::iterator p = dn->replicas_begin(); p != dn->replicas_end(); ++p) { + // don't tell (rename) witnesses; they already know + if (mdr.get() && mdr->more()->witnessed.count(p->first)) + continue; if (mds->mdsmap->get_state(p->first) < MDSMap::STATE_REJOIN || (mds->mdsmap->get_state(p->first) == MDSMap::STATE_REJOIN && rejoin_gather.count(p->first))) @@ -10895,7 +10898,7 @@ void MDCache::send_dentry_unlink(CDentry *dn, CDentry *straydn, MDRequestRef& md it != dn->replicas_end(); ++it) { // don't tell (rmdir) witnesses; they already know - if (mdr && mdr->more()->witnessed.count(it->first)) + if (mdr.get() && mdr->more()->witnessed.count(it->first)) continue; if (mds->mdsmap->get_state(it->first) < MDSMap::STATE_REJOIN || diff --git a/src/mds/MDCache.h b/src/mds/MDCache.h index c536d32f74b71..1140ce1b7b24f 100644 --- a/src/mds/MDCache.h +++ b/src/mds/MDCache.h @@ -947,7 +947,7 @@ public: // -- namespace -- public: - void send_dentry_link(CDentry *dn); + void send_dentry_link(CDentry *dn, MDRequestRef& mdr); void send_dentry_unlink(CDentry *dn, CDentry *straydn, MDRequestRef& mdr); protected: void handle_dentry_link(MDentryLink *m); diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 98617f17f48f7..6e30744ccee47 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -2624,7 +2624,8 @@ public: mds->locker->share_inode_max_size(newi); - mds->mdcache->send_dentry_link(dn); + MDRequestRef null_ref; + mds->mdcache->send_dentry_link(dn, null_ref); mds->balancer->hit_inode(mdr->now, newi, META_POP_IWR); @@ -3948,7 +3949,8 @@ public: mdr->apply(); - mds->mdcache->send_dentry_link(dn); + MDRequestRef null_ref; + mds->mdcache->send_dentry_link(dn, null_ref); if (newi->inode.is_file()) mds->locker->share_inode_max_size(newi); @@ -4328,8 +4330,9 @@ void Server::_link_local_finish(MDRequestRef& mdr, CDentry *dn, CInode *targeti, targeti->pop_and_dirty_projected_inode(mdr->ls); mdr->apply(); - - mds->mdcache->send_dentry_link(dn); + + MDRequestRef null_ref; + mds->mdcache->send_dentry_link(dn, null_ref); // bump target popularity mds->balancer->hit_inode(mdr->now, targeti, META_POP_IWR); @@ -4450,12 +4453,11 @@ void Server::_link_remote_finish(MDRequestRef& mdr, bool inc, mdr->apply(); + MDRequestRef null_ref; if (inc) - mds->mdcache->send_dentry_link(dn); - else { - MDRequestRef null_ref; + mds->mdcache->send_dentry_link(dn, null_ref); + else mds->mdcache->send_dentry_unlink(dn, NULL, null_ref); - } // commit anchor update? if (mdr->more()->dst_reanchor_atid) @@ -5647,9 +5649,11 @@ void Server::handle_client_rename(MDRequestRef& mdr) witnesses.insert(srcdn->authority().first); if (srcdnl->is_remote() && !srci->is_auth()) witnesses.insert(srci->authority().first); - destdn->list_replicas(witnesses); - if (destdnl->is_remote() && !oldin->is_auth()) - witnesses.insert(oldin->authority().first); + if (!destdnl->is_null()) { + destdn->list_replicas(witnesses); + if (destdnl->is_remote() && !oldin->is_auth()) + witnesses.insert(oldin->authority().first); + } dout(10) << " witnesses " << witnesses << ", have " << mdr->more()->witnessed << dendl; @@ -5900,6 +5904,8 @@ void Server::_rename_finish(MDRequestRef& mdr, CDentry *srcdn, CDentry *destdn, // apply _rename_apply(mdr, srcdn, destdn, straydn); + mds->mdcache->send_dentry_link(destdn, mdr); + CDentry::linkage_t *destdnl = destdn->get_linkage(); CInode *in = destdnl->get_inode(); bool need_eval = mdr->more()->cap_imports.count(in); -- 2.39.5