]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
os/bluestore: introduce bluestore_volume_selection_reserved cfg option.
authorIgor Fedotov <ifedotov@suse.com>
Fri, 30 Aug 2019 13:26:39 +0000 (16:26 +0300)
committerIgor Fedotov <ifedotov@suse.com>
Wed, 8 Apr 2020 16:31:15 +0000 (19:31 +0300)
This is an alternative (and straightforward) way to specify barred space not allowed for 'use
some extra' BlueFS volume selector policy.
Disabled by default since it should depend on RocksDB settings and actual volume size.

Signed-off-by: Igor Fedotov <ifedotov@suse.com>
(cherry picked from commit 185e6a1adb2add91209d5f937c61c309528518f9)

src/common/legacy_config_opts.h
src/common/options.cc
src/os/bluestore/BlueStore.cc
src/os/bluestore/BlueStore.h

index 3723ca6c5d76c32e3c6117080f434db39cd223dc..367e852abc8933411f41ff97ff2a3c56eaf5b776 100644 (file)
@@ -1091,6 +1091,7 @@ OPTION(bluestore_log_omap_iterator_age, OPT_DOUBLE)
 OPTION(bluestore_log_collection_list_age, OPT_DOUBLE)
 OPTION(bluestore_volume_selection_policy, OPT_STR)
 OPTION(bluestore_volume_selection_reserved_factor, OPT_DOUBLE)
+OPTION(bluestore_volume_selection_reserved, OPT_INT)
 
 OPTION(kstore_max_ops, OPT_U64)
 OPTION(kstore_max_bytes, OPT_U64)
index 7a4c439fb7e67145ef0bad1a502fc69e13aadca9..a5b9e70e0fb37178e8da8cc1b461d43b788311fc 100644 (file)
@@ -4946,6 +4946,11 @@ std::vector<Option> get_global_options() {
       .set_default(2.0)
       .set_description("DB level size multiplier. Determines amount of space at DB device to bar from the usage when 'use some extra' policy is in action. Reserved size is determined as sum(L_max_size[0], L_max_size[L-1]) + L_max_size[L] * this_factor"),
 
+    Option("bluestore_volume_selection_reserved", Option::TYPE_INT, Option::LEVEL_ADVANCED)
+      .set_flag(Option::FLAG_STARTUP)
+      .set_default(0)
+      .set_description("Space reserved at DB device and not allowed for 'use some extra' policy usage. Overrides 'bluestore_volume_selection_reserved_factor' setting and introduces straightforward limit."),
+
     // -----------------------------------------
     // kstore
 
index d157bfa41e73446b135ec3d76eeb4a303d4f10d0..954dffa4531f5f2a97da7754c9b3f819b8aa7bc0 100644 (file)
@@ -5173,6 +5173,7 @@ int BlueStore::_open_bluefs(bool create)
         rocks_opts.max_bytes_for_level_base,
         rocks_opts.max_bytes_for_level_multiplier,
         reserved_factor,
+        cct->_conf->bluestore_volume_selection_reserved,
         cct->_conf->bluestore_volume_selection_policy != "rocksdb_original");
   }
   if (create) {
index 83dba638852e7ef906daf8386b5d389e35239c7e..41d7a1bccbd17961496b3a6d736803fbeac7a1e8 100644 (file)
@@ -3434,6 +3434,7 @@ public:
     uint64_t _level_base,
     uint64_t _level_multiplier,
     double reserved_factor,
+    uint64_t reserved,
     bool new_pol)
   {
     l_totals[LEVEL_WAL - LEVEL_FIRST] = _wal_total;
@@ -3445,23 +3446,29 @@ public:
     }
 
     // Calculating how much extra space is available at DB volume.
-    // Which is equal to
-    // DB size - sum_max_level_size(0, L-1) - max_level_size(L) * reserved_factor
-    uint64_t prev_levels = _level0_size;
-    uint64_t cur_level = _level_base;
-    uint64_t cur_threshold = 0;
-    do {
-      uint64_t next_level = cur_level * _level_multiplier;
-      uint64_t next_threshold = prev_levels + cur_level + next_level * reserved_factor;
-      if (_db_total <= next_threshold) {
-        db_avail4slow = cur_threshold ? _db_total - cur_threshold : 0;
-        break;
-      } else {
-        prev_levels += cur_level;
-        cur_level = next_level;
-        cur_threshold = next_threshold;
-      }
-    } while (true);
+    // Depending on the presence of explicit reserved size specification it might be either
+    // * DB volume size - reserved
+    // or
+    // * DB volume size - sum_max_level_size(0, L-1) - max_level_size(L) * reserved_factor
+    if (!reserved) {
+      uint64_t prev_levels = _level0_size;
+      uint64_t cur_level = _level_base;
+      uint64_t cur_threshold = 0;
+      do {
+        uint64_t next_level = cur_level * _level_multiplier;
+        uint64_t next_threshold = prev_levels + cur_level + next_level * reserved_factor;
+        if (_db_total <= next_threshold) {
+          db_avail4slow = cur_threshold ? _db_total - cur_threshold : 0;
+          break;
+        } else {
+          prev_levels += cur_level;
+          cur_level = next_level;
+          cur_threshold = next_threshold;
+        }
+      } while (true);
+    } else {
+      db_avail4slow = _db_total - reserved;
+    }
   }
 
   void* get_hint_by_device(uint8_t dev) const override {