]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: trim 'N' log segments according to how many log segments are there 18783/head
authorYan, Zheng <zyan@redhat.com>
Mon, 30 Oct 2017 12:03:29 +0000 (20:03 +0800)
committerYan, Zheng <zyan@redhat.com>
Tue, 7 Nov 2017 07:53:18 +0000 (15:53 +0800)
Config 'mds_log_max_expiring' is 20 by default. It means that at most
20 log segments get trimmed in each tick. For busy cluster, this can
cause mds behind on trimming log segments.

Fixes: fixes: http://tracker.ceph.com/issues/21975
Signed-off-by: "Yan, Zheng" <zyan@redhat.com>
(cherry picked from commit 7de37382ace36b6b724b07dcd58178137c49e6b8)

src/common/legacy_config_opts.h
src/common/options.cc
src/mds/MDLog.cc

index 44bd6b1043498aa4c1ad2b17a41e36be70ac5bc0..51600cff2461fdc27e64e46811f14e1bdcf52c35 100644 (file)
@@ -462,7 +462,6 @@ OPTION(mds_log_max_events, OPT_INT)
 OPTION(mds_log_events_per_segment, OPT_INT)
 OPTION(mds_log_segment_size, OPT_INT)  // segment size for mds log, default to default file_layout_t
 OPTION(mds_log_max_segments, OPT_U32)
-OPTION(mds_log_max_expiring, OPT_INT)
 OPTION(mds_bal_export_pin, OPT_BOOL)  // allow clients to pin directory trees to ranks
 OPTION(mds_bal_sample_interval, OPT_DOUBLE)  // every 3 seconds
 OPTION(mds_bal_replicate_threshold, OPT_FLOAT)
index 71f58a35f1b7d4d606e381bf619139a627ef9081..9d5cd7bbf48d9fb200fc4d07ab33ae9450f3155b 100644 (file)
@@ -5525,10 +5525,6 @@ std::vector<Option> get_mds_options() {
     .set_default(30)
     .set_description(""),
 
-    Option("mds_log_max_expiring", Option::TYPE_INT, Option::LEVEL_ADVANCED)
-    .set_default(20)
-    .set_description(""),
-
     Option("mds_bal_export_pin", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
     .set_default(true)
     .set_description(""),
index 806974a1d0b7dc0d6f1d87c96ecce7738183ad68..a38f2d0db205f2eb0c52b877658e7d7bda9112d3 100644 (file)
@@ -602,22 +602,28 @@ void MDLog::trim(int m)
   utime_t stop = ceph_clock_now();
   stop += 2.0;
 
+  int op_prio = CEPH_MSG_PRIO_LOW +
+               (CEPH_MSG_PRIO_HIGH - CEPH_MSG_PRIO_LOW) *
+               expiring_segments.size() / max_segments;
+  if (op_prio > CEPH_MSG_PRIO_HIGH)
+    op_prio = CEPH_MSG_PRIO_HIGH;
+
+  unsigned new_expiring_segments = 0;
+
   map<uint64_t,LogSegment*>::iterator p = segments.begin();
-  while (p != segments.end() &&
-        ((max_events >= 0 &&
-          num_events - expiring_events - expired_events > max_events) ||
-         (segments.size() - expiring_segments.size() - expired_segments.size() > max_segments))) {
-    
+  while (p != segments.end()) {
     if (stop < ceph_clock_now())
       break;
 
-    int num_expiring_segments = (int)expiring_segments.size();
-    if (num_expiring_segments >= g_conf->mds_log_max_expiring)
+    unsigned num_remaining_segments = (segments.size() - expired_segments.size() - expiring_segments.size());
+    if ((num_remaining_segments <= max_segments) &&
+       (max_events < 0 || num_events - expiring_events - expired_events <= max_events))
       break;
 
-    int op_prio = CEPH_MSG_PRIO_LOW +
-                 (CEPH_MSG_PRIO_HIGH - CEPH_MSG_PRIO_LOW) *
-                 num_expiring_segments / g_conf->mds_log_max_expiring;
+    // Do not trim too many segments at once for peak workload. If mds keeps creating N segments each tick,
+    // the upper bound of 'num_remaining_segments - max_segments' is '2 * N'
+    if (new_expiring_segments * 2 > num_remaining_segments)
+      break;
 
     // look at first segment
     LogSegment *ls = p->second;
@@ -638,6 +644,7 @@ void MDLog::trim(int m)
              << ", " << ls->num_events << " events" << dendl;
     } else {
       assert(expiring_segments.count(ls) == 0);
+      new_expiring_segments++;
       expiring_segments.insert(ls);
       expiring_events += ls->num_events;
       submit_mutex.Unlock();