]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: avoid adding replicas of target dentry to rename witnesses 1741/head
authorYan, Zheng <zheng.z.yan@intel.com>
Wed, 30 Apr 2014 10:30:25 +0000 (18:30 +0800)
committerYan, Zheng <zheng.z.yan@intel.com>
Wed, 30 Apr 2014 17:33:14 +0000 (01:33 +0800)
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 <zheng.z.yan@intel.com>
src/mds/MDCache.cc
src/mds/MDCache.h
src/mds/Server.cc

index 49f33080f5bf59822425f44ab4026afa7d90b004..f90a5c45aab95704a76485a110fc479df93885a9 100644 (file)
@@ -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<int,unsigned>::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 ||
index c536d32f74b717d900e77d32301895aa94b1425c..1140ce1b7b24facf17b0d0edcbe689b3ddc3bfae 100644 (file)
@@ -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);
index 98617f17f48f7f847aadff55a4280dac31746add..6e30744ccee475659e40ce46279dfcba95007572 100644 (file)
@@ -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);