From: Yan, Zheng Date: Sun, 19 Jan 2014 02:36:45 +0000 (+0800) Subject: mds: fixes for thrash fragment X-Git-Tag: v0.78~165^2~8 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=3b90c785402588bdc129a75b93f5589261fb481b;p=ceph.git mds: fixes for thrash fragment This patch contains 3 changes: - limit the number of in progress fragmenting processes. - reduce the probability of splitting small dirfrag. - process the merge_queue when thrash_fragments is enabled. Signed-off-by: Yan, Zheng --- diff --git a/src/mds/MDBalancer.cc b/src/mds/MDBalancer.cc index 6a404c46974b..06989b572902 100644 --- a/src/mds/MDBalancer.cc +++ b/src/mds/MDBalancer.cc @@ -100,7 +100,8 @@ void MDBalancer::tick() } // hash? - if (g_conf->mds_bal_frag && g_conf->mds_bal_fragment_interval > 0 && + if ((g_conf->mds_bal_frag || g_conf->mds_thrash_fragments) && + g_conf->mds_bal_fragment_interval > 0 && now.sec() - last_fragment.sec() > g_conf->mds_bal_fragment_interval) { last_fragment = now; do_fragmenting(); diff --git a/src/mds/MDCache.h b/src/mds/MDCache.h index 1c2f8487ec32..060a8044c194 100644 --- a/src/mds/MDCache.h +++ b/src/mds/MDCache.h @@ -1010,6 +1010,7 @@ public: void find_stale_fragment_freeze(); void fragment_freeze_inc_num_waiters(CDir *dir); + int get_num_fragmenting_dirs() { return fragments.size(); } // -- updates -- //int send_inode_updates(CInode *in); diff --git a/src/mds/MDS.cc b/src/mds/MDS.cc index 7ff1110f247f..c62b75fc190e 100644 --- a/src/mds/MDS.cc +++ b/src/mds/MDS.cc @@ -2006,6 +2006,7 @@ bool MDS::_dispatch(Message *m) // hack: thrash fragments for (int i=0; imds_thrash_fragments; i++) { if (!is_active()) break; + if (mdcache->get_num_fragmenting_dirs() > 5) break; dout(7) << "mds thrashing fragments pass " << (i+1) << "/" << g_conf->mds_thrash_fragments << dendl; // pick a random dir inode @@ -2017,9 +2018,10 @@ bool MDS::_dispatch(Message *m) CDir *dir = ls.front(); if (!dir->get_parent_dir()) continue; // must be linked. if (!dir->is_auth()) continue; // must be auth. - if (dir->get_frag() == frag_t() || (rand() % 3 == 0)) { + frag_t fg = dir->get_frag(); + if (fg == frag_t() || (rand() % (1 << fg.bits()) == 0)) mdcache->split_dir(dir, 1); - } else + else balancer->queue_merge(dir); }