From 86bbc7fff02668077f27d0924ba3efe6544b77f6 Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Wed, 25 Jan 2017 15:28:23 +0800 Subject: [PATCH] mds: don't purge strays when mds is in clientreplay state MDS does not trim log when it's in clientreplay state. If mds hang at clientreplay state (due to bug), purging strays can submit lots of log events and create very large mds log. Signed-off-by: "Yan, Zheng" --- src/mds/MDCache.h | 4 ++++ src/mds/MDSRank.cc | 1 + src/mds/StrayManager.cc | 14 +++++++++++++- src/mds/StrayManager.h | 3 +++ 4 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/mds/MDCache.h b/src/mds/MDCache.h index a9c41193478a7..2b96af9a2f470 100644 --- a/src/mds/MDCache.h +++ b/src/mds/MDCache.h @@ -146,6 +146,10 @@ public: stray_index = (stray_index+1)%NUM_STRAY; } + void activate_stray_manager() { + stray_manager.activate(); + } + /** * Call this when you know that a CDentry is ready to be passed * on to StrayManager (i.e. this is a stray you've just created) diff --git a/src/mds/MDSRank.cc b/src/mds/MDSRank.cc index d1127fdeafd7a..36c0947d98b95 100644 --- a/src/mds/MDSRank.cc +++ b/src/mds/MDSRank.cc @@ -1285,6 +1285,7 @@ void MDSRank::active_start() mdcache->start_files_to_recover(); mdcache->reissue_all_caps(); + mdcache->activate_stray_manager(); finish_contexts(g_ceph_context, waiting_for_active); // kick waiters } diff --git a/src/mds/StrayManager.cc b/src/mds/StrayManager.cc index 34d733691d5ac..f62c73dab4917 100644 --- a/src/mds/StrayManager.cc +++ b/src/mds/StrayManager.cc @@ -433,6 +433,11 @@ bool StrayManager::_consume(CDentry *dn, bool trunc, uint32_t ops_required) { const int files_avail = g_conf->mds_max_purge_files - files_purging; + if (!started) { + dout(20) << __func__ << ": haven't started purging yet" << dendl; + return false; + } + if (files_avail <= 0) { dout(20) << __func__ << ": throttling on max files" << dendl; return false; @@ -732,6 +737,13 @@ bool StrayManager::__eval_stray(CDentry *dn, bool delay) } } +void StrayManager::activate() +{ + dout(10) << __func__ << dendl; + started = true; + _advance(); +} + bool StrayManager::eval_stray(CDentry *dn, bool delay) { // avoid nested eval_stray @@ -838,7 +850,7 @@ void StrayManager::migrate_stray(CDentry *dn, mds_rank_t to) StrayManager::StrayManager(MDSRank *mds) : delayed_eval_stray(member_offset(CDentry, item_stray)), - mds(mds), logger(NULL), + mds(mds), logger(NULL), started(false), ops_in_flight(0), files_purging(0), max_purge_ops(0), num_strays(0), num_strays_purging(0), num_strays_delayed(0), diff --git a/src/mds/StrayManager.h b/src/mds/StrayManager.h index 7c9f04e7b1eb7..892890b164470 100644 --- a/src/mds/StrayManager.h +++ b/src/mds/StrayManager.h @@ -55,6 +55,8 @@ class StrayManager MDSRank *mds; PerfCounters *logger; + bool started; + // Throttled allowances uint64_t ops_in_flight; uint64_t files_purging; @@ -168,6 +170,7 @@ class StrayManager public: explicit StrayManager(MDSRank *mds); void set_logger(PerfCounters *l) {logger = l;} + void activate(); bool eval_stray(CDentry *dn, bool delay=false); -- 2.39.5