From: Yan, Zheng Date: Wed, 6 Dec 2017 05:56:26 +0000 (+0800) Subject: mds: optimize MDBalancer::find_exports() X-Git-Tag: v13.1.0~332^2~5 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=04831d463c63c90124a28307908afe3d478466dd;p=ceph.git mds: optimize MDBalancer::find_exports() stop at subtree bounds; make freezing/frozen check more efficient. Signed-off-by: "Yan, Zheng" --- diff --git a/src/mds/MDBalancer.cc b/src/mds/MDBalancer.cc index 765acde9a104f..8b106a2c1eb5f 100644 --- a/src/mds/MDBalancer.cc +++ b/src/mds/MDBalancer.cc @@ -984,9 +984,12 @@ void MDBalancer::find_exports(CDir *dir, double& have, set& already_exporting) { + assert(dir->is_auth()); + double need = amount - have; if (need < amount * g_conf->mds_bal_min_start) return; // good enough! + double needmax = need * g_conf->mds_bal_need_max; double needmin = need * g_conf->mds_bal_need_min; double midchunk = need * g_conf->mds_bal_midchunk; @@ -1005,15 +1008,19 @@ void MDBalancer::find_exports(CDir *dir, if (!in->is_dir()) continue; list dfls; - in->get_dirfrags(dfls); + in->get_nested_dirfrags(dfls); for (list::iterator p = dfls.begin(); p != dfls.end(); ++p) { CDir *subdir = *p; - if (!subdir->is_auth()) continue; - if (already_exporting.count(subdir)) continue; + if (already_exporting.count(subdir)) + continue; - if (subdir->is_frozen() || subdir->is_freezing()) continue; // can't export this right now! + // we know all ancestor dirfrags up to subtree root are not freezing or frozen. + // It's more efficient to use CDir::is_{freezing,frozen}_tree_root() + if (subdir->is_frozen_dir() || subdir->is_frozen_tree_root() || + subdir->is_freezing_dir() || subdir->is_freezing_tree_root()) + continue; // can't export this right now! // how popular? double pop = subdir->pop_auth_subtree.meta_load(rebalance_time, mds->mdcache->decayrate); @@ -1091,7 +1098,6 @@ void MDBalancer::find_exports(CDir *dir, if (have > needmin) return; } - } void MDBalancer::hit_inode(const utime_t& now, CInode *in, int type, int who)