From: Yan, Zheng Date: Sun, 17 Mar 2013 03:13:38 +0000 (+0800) Subject: mds: clear scatter dirty if replica inode has no auth subtree X-Git-Tag: v0.62~120^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=2b0f03cbf84cb768778470792712c10223696522;p=ceph.git mds: clear scatter dirty if replica inode has no auth subtree This avoids sending superfluous scatterlock state to recovering MDS Signed-off-by: Yan, Zheng Reviewed-by: Greg Farnum --- diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index 192222180eca..781ed727f5f4 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -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::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; } diff --git a/src/mds/CInode.h b/src/mds/CInode.h index 817470140467..43af9c4d5940 100644 --- a/src/mds/CInode.h +++ b/src/mds/CInode.h @@ -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(); diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 0e2ab7fdcca7..7a70a682cad9 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -3334,8 +3334,10 @@ void MDCache::recalc_auth_bits() set subtree_inodes; for (map >::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 >::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? diff --git a/src/mds/Migrator.cc b/src/mds/Migrator.cc index 28a782ec6bce..7ec53f3eae07 100644 --- a/src/mds/Migrator.cc +++ b/src/mds/Migrator.cc @@ -1095,6 +1095,10 @@ void Migrator::finish_export_inode(CInode *in, utime_t now, list& 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 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();