]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: clear scatter dirty if replica inode has no auth subtree
authorYan, Zheng <zheng.z.yan@intel.com>
Sun, 17 Mar 2013 03:13:38 +0000 (11:13 +0800)
committerGreg Farnum <greg@inktank.com>
Mon, 1 Apr 2013 16:26:24 +0000 (09:26 -0700)
This avoids sending superfluous scatterlock state to recovering MDS

Signed-off-by: Yan, Zheng <zheng.z.yan@intel.com>
Reviewed-by: Greg Farnum <greg@inktank.com>
src/mds/CInode.cc
src/mds/CInode.h
src/mds/MDCache.cc
src/mds/Migrator.cc

index 192222180ecadfabd4eb2fca70b42b90643c8bb9..781ed727f5f4e89a1607b67029beda3207e4ca82 100644 (file)
@@ -614,12 +614,13 @@ void CInode::close_dirfrags()
     close_dirfrag(dirfrags.begin()->first);
 }
 
-bool CInode::has_subtree_root_dirfrag()
+bool CInode::has_subtree_root_dirfrag(int auth)
 {
   for (map<frag_t,CDir*>::iterator p = dirfrags.begin();
        p != dirfrags.end();
        ++p)
-    if (p->second->is_subtree_root())
+    if (p->second->is_subtree_root() &&
+       (auth == -1 || p->second->dir_auth.first == auth))
       return true;
   return false;
 }
index 81747014046780c56cfddc348488aee2cbabe90e..43af9c4d59406f4f27a86af2e8f647043c5cb0ae 100644 (file)
@@ -343,7 +343,7 @@ public:
   CDir *add_dirfrag(CDir *dir);
   void close_dirfrag(frag_t fg);
   void close_dirfrags();
-  bool has_subtree_root_dirfrag();
+  bool has_subtree_root_dirfrag(int auth=-1);
 
   void force_dirfrags();
   void verify_dirfrags();
index 0e2ab7fdcca7904d43b809a0787e748af1bd299d..7a70a682cad9908b897ddcc3aae070bdfebdfc34 100644 (file)
@@ -3334,8 +3334,10 @@ void MDCache::recalc_auth_bits()
   set<CInode*> subtree_inodes;
   for (map<CDir*,set<CDir*> >::iterator p = subtrees.begin();
        p != subtrees.end();
-       ++p)
-    subtree_inodes.insert(p->first->inode);      
+       ++p) {
+    if (p->first->dir_auth.first == mds->get_nodeid())
+      subtree_inodes.insert(p->first->inode);
+  }
 
   for (map<CDir*,set<CDir*> >::iterator p = subtrees.begin();
        p != subtrees.end();
@@ -3394,11 +3396,8 @@ void MDCache::recalc_auth_bits()
            if (dnl->get_inode()->is_dirty())
              dnl->get_inode()->mark_clean();
            // avoid touching scatterlocks for our subtree roots!
-           if (subtree_inodes.count(dnl->get_inode()) == 0) {
-             dnl->get_inode()->filelock.remove_dirty();
-             dnl->get_inode()->nestlock.remove_dirty();
-             dnl->get_inode()->dirfragtreelock.remove_dirty();
-           }
+           if (subtree_inodes.count(dnl->get_inode()) == 0)
+             dnl->get_inode()->clear_scatter_dirty();
          }
 
          // recurse?
index 28a782ec6bce19799d47dc584714d5d220f362c2..7ec53f3eae07c95fb7748e431112c02ab01bc0ae 100644 (file)
@@ -1095,6 +1095,10 @@ void Migrator::finish_export_inode(CInode *in, utime_t now, list<Context*>& fini
   
   in->clear_dirty_rstat();
 
+  // no more auth subtree? clear scatter dirty
+  if (!in->has_subtree_root_dirfrag(mds->get_nodeid()))
+    in->clear_scatter_dirty();
+
   in->item_open_file.remove_myself();
 
   // waiters
@@ -1534,6 +1538,11 @@ void Migrator::export_finish(CDir *dir)
   cache->adjust_subtree_auth(dir, export_peer[dir]);
   cache->try_subtree_merge(dir);  // NOTE: may journal subtree_map as sideeffect
 
+  // no more auth subtree? clear scatter dirty
+  if (!dir->get_inode()->is_auth() &&
+      !dir->get_inode()->has_subtree_root_dirfrag(mds->get_nodeid()))
+    dir->get_inode()->clear_scatter_dirty();
+
   // unpin path
   export_unlock(dir);
 
@@ -2020,6 +2029,10 @@ void Migrator::import_reverse(CDir *dir)
     cache->trim_non_auth_subtree(dir);
   cache->adjust_subtree_auth(dir, import_peer[dir->dirfrag()]);
 
+  if (!dir->get_inode()->is_auth() &&
+      !dir->get_inode()->has_subtree_root_dirfrag(mds->get_nodeid()))
+    dir->get_inode()->clear_scatter_dirty();
+
   // adjust auth bits.
   list<CDir*> q;
   q.push_back(dir);
@@ -2053,6 +2066,8 @@ void Migrator::import_reverse(CDir *dir)
        if (in->is_dirty()) 
          in->mark_clean();
        in->clear_dirty_rstat();
+       if (!in->has_subtree_root_dirfrag(mds->get_nodeid()))
+         in->clear_scatter_dirty();
 
        in->authlock.clear_gather();
        in->linklock.clear_gather();