]> 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 18624/head
authorYan, Zheng <zyan@redhat.com>
Mon, 30 Oct 2017 12:03:29 +0000 (20:03 +0800)
committerYan, Zheng <zyan@redhat.com>
Wed, 1 Nov 2017 02:59:48 +0000 (10:59 +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>
src/common/legacy_config_opts.h
src/common/options.cc
src/mds/MDLog.cc

index 0887a0d9494a45adc6fc6a1dadc19e8c4de04b32..fcbd539966386b8e0c6e74c89e128c0d64934b4f 100644 (file)
@@ -454,7 +454,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 111ab63502ac7bdf14c959a9ffcb1736cefced2f..d9a53a09d377a656f8e05568a03d810dddb29cd8 100644 (file)
@@ -5624,10 +5624,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();