From: Yan, Zheng Date: Wed, 11 Jul 2018 09:30:39 +0000 (+0800) Subject: mds: reset heartbeat map at potential time-consuming places X-Git-Tag: v14.0.1~661^2~1 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=5a6a9a3fdafa4d68d337e031dd2358215771be8f;p=ceph.git mds: reset heartbeat map at potential time-consuming places Signed-off-by: Yan, Zheng Fixes: http://tracker.ceph.com/issues/26858 --- diff --git a/src/mds/MDSRank.cc b/src/mds/MDSRank.cc index 2997baf719b6e..4f056de089528 100644 --- a/src/mds/MDSRank.cc +++ b/src/mds/MDSRank.cc @@ -1947,7 +1947,7 @@ void MDSRankDispatcher::handle_mds_map( MDSInternalContextBase::vec ls; ls.swap(p->second); waiting_for_mdsmap.erase(p++); - finish_contexts(g_ceph_context, ls); + queue_waiters(ls); } } diff --git a/src/mds/MDSRank.h b/src/mds/MDSRank.h index 2b8807ae283ec..dd6fba923deac 100644 --- a/src/mds/MDSRank.h +++ b/src/mds/MDSRank.h @@ -307,6 +307,12 @@ class MDSRank { std::copy(v.begin(), v.end(), std::back_inserter(finished_queue)); progress_thread.signal(); } + void queue_waiters_front(MDSInternalContextBase::vec& ls) { + MDSInternalContextBase::vec v; + v.swap(ls); + std::copy(v.rbegin(), v.rend(), std::front_inserter(finished_queue)); + progress_thread.signal(); + } MDSRank( mds_rank_t whoami_, diff --git a/src/mds/Migrator.cc b/src/mds/Migrator.cc index 22c8de969112e..df19531a7e0c5 100644 --- a/src/mds/Migrator.cc +++ b/src/mds/Migrator.cc @@ -2593,6 +2593,15 @@ void Migrator::import_remove_pins(CDir *dir, set& bounds) } } +class C_MDC_QueueContexts : public MigratorContext { +public: + MDSInternalContextBase::vec contexts; + C_MDC_QueueContexts(Migrator *m) : MigratorContext(m) {} + void finish(int r) override { + // execute contexts immediately after 'this' context + get_mds()->queue_waiters_front(contexts); + } +}; /* * note: this does teh full work of reversing and import and cleaning up @@ -2620,7 +2629,7 @@ void Migrator::import_reverse(CDir *dir) cache->adjust_subtree_auth(dir, stat.peer); - auto fin = new C_ContextsBase(g_ceph_context); + auto fin = new C_MDC_QueueContexts(this); if (!dir->get_inode()->is_auth() && !dir->get_inode()->has_subtree_root_dirfrag(mds->get_nodeid())) { dir->get_inode()->clear_scatter_dirty(); diff --git a/src/mds/OpenFileTable.cc b/src/mds/OpenFileTable.cc index d3dae5ba4f759..86d5579274ffd 100644 --- a/src/mds/OpenFileTable.cc +++ b/src/mds/OpenFileTable.cc @@ -1057,10 +1057,14 @@ void OpenFileTable::_prefetch_dirfrags() } MDSGatherBuilder gather(g_ceph_context); + int num_opening_dirfrags = 0; for (auto dir : fetch_queue) { if (dir->state_test(CDir::STATE_REJOINUNDEF)) assert(dir->get_inode()->dirfragtree.is_leaf(dir->get_frag())); dir->fetch(gather.new_sub()); + + if (!(++num_opening_dirfrags % 1000)) + mds->heartbeat_reset(); } auto finish_func = [this](int r) { @@ -1123,6 +1127,9 @@ void OpenFileTable::_prefetch_inodes() num_opening_inodes++; mdcache->open_ino(it.first, pool, new C_OFT_OpenInoFinish(this, it.first), false); + + if (!(num_opening_inodes % 1000)) + mds->heartbeat_reset(); } _open_ino_finish(inodeno_t(0), 0);