}
// 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();
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);
// 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
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);
}