]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: disallow dumping huge caches to formatter 25642/head
authorVenky Shankar <vshankar@redhat.com>
Thu, 8 Nov 2018 12:58:37 +0000 (18:28 +0530)
committerVenky Shankar <vshankar@redhat.com>
Tue, 22 Jan 2019 09:21:33 +0000 (04:21 -0500)
Dumping huge caches (~ 1G) to formatter causes mds to
hang or get terminated. Until the underlying issues is
fixed, disallow dumping cache if cache usage exceeds this
threshold. Also, Patrick feels a similar issue might be
hiding there for cache dumps to file when cache sizes
are really huge. This case has not been been reproduced
yet, hence, the limit for cache dumps to file is currently
kept not capped.

Fixes: http://tracker.ceph.com/issues/37609
Signed-off-by: Venky Shankar <vshankar@redhat.com>
(cherry picked from commit 6be2ce98c629d2cfe9d8443659e59600148b7675)

 Conflicts:
src/common/options.cc
src/mds/MDCache.cc

Minor fix for fetching config option with g_conf.

src/common/options.cc
src/mds/MDCache.cc
src/mds/MDSDaemon.cc

index 5d1c969462617f0e83dbd14674390c5bda87f7ad..60b2ffe81377d71e5dba7fa040d17b465a0780de 100644 (file)
@@ -7093,6 +7093,16 @@ std::vector<Option> get_mds_options() {
     Option("mds_max_retries_on_remount_failure", Option::TYPE_UINT, Option::LEVEL_ADVANCED)
      .set_default(5)
      .set_description("number of consecutive failed remount attempts for invalidating kernel dcache after which client would abort."),
+
+    Option("mds_dump_cache_threshold_formatter", Option::TYPE_SIZE, Option::LEVEL_DEV)
+     .set_default(1_G)
+     .set_description("threshold for cache usage to disallow \"dump cache\" operation to formatter")
+     .set_long_description("Disallow MDS from dumping caches to formatter via \"dump cache\" command if cache usage exceeds this threshold."),
+
+    Option("mds_dump_cache_threshold_file", Option::TYPE_SIZE, Option::LEVEL_DEV)
+     .set_default(0)
+     .set_description("threshold for cache usage to disallow \"dump cache\" operation to file")
+     .set_long_description("Disallow MDS from dumping caches to file via \"dump cache\" command if cache usage exceeds this threshold."),
   });
 }
 
index 9ec17384adbe062879757afc65e66877fbc435de..9042ec26c33fd714a078d754e8e6c27a6bc690d7 100644 (file)
@@ -12292,6 +12292,32 @@ int MDCache::dump_cache(Formatter *f)
 int MDCache::dump_cache(std::string_view fn, Formatter *f)
 {
   int r = 0;
+
+  // dumping large caches may cause mds to hang or worse get killed.
+  // so, disallow the dump if the cache size exceeds the configured
+  // threshold, which is 1G for formatter and unlimited for file (note
+  // that this can be jacked up by the admin... and is nothing but foot
+  // shooting, but the option itself is for devs and hence dangerous to
+  // tune). TODO: remove this when fixed.
+  uint64_t threshold = f ?
+    g_conf->get_val<Option::size_t>("mds_dump_cache_threshold_formatter") :
+    g_conf->get_val<Option::size_t>("mds_dump_cache_threshold_file");
+
+  if (threshold && cache_size() > threshold) {
+    if (f) {
+      std::stringstream ss;
+      ss << "cache usage exceeds dump threshold";
+      f->open_object_section("result");
+      f->dump_string("error", ss.str());
+      f->close_section();
+    } else {
+      derr << "cache usage exceeds dump threshold" << dendl;
+      r = -EINVAL;
+    }
+    return r;
+  }
+
+  r = 0;
   int fd = -1;
 
   if (f) {
index 09bc9b5b882817d3df1d73b870e085d23540e906..de118eebd337cad2437c485c20a60fce48abcca4 100644 (file)
@@ -383,6 +383,8 @@ const char** MDSDaemon::get_tracked_conf_keys() const
     "mds_cache_reservation",
     "mds_health_cache_threshold",
     "mds_cache_mid",
+    "mds_dump_cache_threshold_formatter",
+    "mds_dump_cache_threshold_file",
     // MDBalancer
     "mds_bal_fragment_dirs",
     "mds_bal_fragment_interval",