]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: fixes for thrash fragment
authorYan, Zheng <zheng.z.yan@intel.com>
Sun, 19 Jan 2014 02:36:45 +0000 (10:36 +0800)
committerYan, Zheng <zheng.z.yan@intel.com>
Mon, 17 Feb 2014 01:37:51 +0000 (09:37 +0800)
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 <zheng.z.yan@intel.com>
src/mds/MDBalancer.cc
src/mds/MDCache.h
src/mds/MDS.cc

index 6a404c46974b4e369e01718ae1c88ada2f6646af..06989b5729029884befe3a79391f50a5dc4b048d 100644 (file)
@@ -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();
index 1c2f8487ec32bbc69b0a246322eb6222c1c2621e..060a8044c194d6f8ffd88978ffc48b5c5975d956 100644 (file)
@@ -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);
index 7ff1110f247ffff895c43507908e0e506c0f469f..c62b75fc190ee7330ac2cae6895f66ca5c6e5540 100644 (file)
@@ -2006,6 +2006,7 @@ bool MDS::_dispatch(Message *m)
   // hack: thrash fragments
   for (int i=0; i<g_conf->mds_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);
   }