]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: don't purge strays when mds is in clientreplay state 14568/head
authorYan, Zheng <zyan@redhat.com>
Wed, 25 Jan 2017 07:28:23 +0000 (15:28 +0800)
committerNathan Cutler <ncutler@suse.com>
Fri, 14 Apr 2017 21:48:07 +0000 (23:48 +0200)
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" <zyan@redhat.com>
(cherry picked from commit 86bbc7fff02668077f27d0924ba3efe6544b77f6)

src/mds/MDCache.h
src/mds/MDSRank.cc
src/mds/StrayManager.cc
src/mds/StrayManager.h

index 9304f94df2a6dc7f96fdfeaef350f90061b01715..806ed33212af4febbd8425216d80100750564a22 100644 (file)
@@ -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)
index e1f28f6c0218f62a0856f2f8457d8a17229a5221..6a7be50dc96566a52bebcbc4fd96538bdb53afa1 100644 (file)
@@ -1281,6 +1281,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
 }
index d7f449b66bd1264de94e4125dfeea777fc7096d1..185c1695daac82a633a979c9fde9c44203baa376 100644 (file)
@@ -432,6 +432,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;
@@ -731,6 +736,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
@@ -836,7 +848,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),
index 7c9f04e7b1eb7fa9eeec72adf4bf0fa2dd26038c..892890b1644708984269ffc7bc28bbd1391d7977 100644 (file)
@@ -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);