]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
os/bluestore: add 'bluefs stats reset' admin socket command. 67609/head
authorIgor Fedotov <igor.fedotov@croit.io>
Mon, 2 Mar 2026 14:10:38 +0000 (17:10 +0300)
committerIgor Fedotov <igor.fedotov@croit.io>
Mon, 2 Mar 2026 14:10:38 +0000 (17:10 +0300)
Which resets historical maximums for BlueFS volume selector. Hence
eliminating the need to restart OSD if needed.

Signed-off-by: Igor Fedotov <igor.fedotov@croit.io>
src/os/bluestore/BlueFS.cc
src/os/bluestore/BlueFS.h
src/test/objectstore/test_bluestore_vselector.cc

index d9885d46cc757ba80be6a15fb58affde2d4c3c2e..61470f7f9a99dc8b3ef6f82b1500bcb2817cdb30 100644 (file)
@@ -103,6 +103,11 @@ public:
                                            "Dump internal statistics for bluefs."
                                            "");
         ceph_assert(r == 0);
+        r = admin_socket->register_command("bluefs stats reset",
+                                           hook,
+                                           "Reset maximum historical value for bluefs statistics."
+                                           "");
+        ceph_assert(r == 0);
        r = admin_socket->register_command("bluefs files list", hook,
                                           "print files in bluefs");
        ceph_assert(r == 0);
@@ -162,6 +167,10 @@ private:
       bluefs->dump_block_extents(ss);
       bluefs->dump_volume_selector(ss);
       out.append(ss);
+    } else if (command == "bluefs stats reset") {
+      std::stringstream ss;
+      bluefs->reset_volume_selector(ss);
+      out.append(ss);
     } else if (command == "bluefs files list") {
       const char* devnames[3] = {"wal","db","slow"};
       std::lock_guard l(bluefs->nodes.lock);
@@ -5471,6 +5480,11 @@ void* RocksDBBlueFSVolumeSelector::get_hint_by_dir(std::string_view dirname) con
   return reinterpret_cast<void*>(res);
 }
 
+void RocksDBBlueFSVolumeSelector::reset_history(ostream& sout) {
+  per_level_per_dev_max.clear();
+  sout << "Reset done." << std::endl;
+}
+
 void RocksDBBlueFSVolumeSelector::dump(ostream& sout) {
   auto max_x = per_level_per_dev_usage.get_max_x();
   auto max_y = per_level_per_dev_usage.get_max_y();
index 5f676aa27f16894411b4e55cbdca830041c24950..8b766a5ef60d883fa6eb026993c5ec458a81a968 100644 (file)
@@ -202,6 +202,12 @@ public:
   */
   virtual void dump(std::ostream& sout) = 0;
 
+  /**
+  *  Reset VSelector's historic state
+  *
+  */
+  virtual void reset_history(std::ostream& sout) = 0;
+
   /* used for sanity checking of vselector */
   virtual BlueFSVolumeSelector* clone_empty() const { return nullptr; }
   virtual bool compare(BlueFSVolumeSelector* other) { return true; };
@@ -871,6 +877,10 @@ public:
     ceph_assert(vselector);
     vselector->dump(sout);
   }
+  void reset_volume_selector(std::ostream& sout) {
+    ceph_assert(vselector);
+    vselector->reset_history(sout);
+  }
   void update_volume_selector_from_config() {
     ceph_assert(vselector);
     vselector->update_from_config(cct);
@@ -988,6 +998,11 @@ public:
   uint8_t select_prefer_bdev(void* hint) override;
   void get_paths(const std::string& base, paths& res) const override;
   void dump(std::ostream& sout) override;
+
+  void reset_history(std::ostream& sout) override {
+    // do nothing
+    return;
+  }
 };
 
 class FitToFastVolumeSelector : public OriginalVolumeSelector {
@@ -1016,6 +1031,12 @@ class RocksDBBlueFSVolumeSelector : public BlueFSVolumeSelector
 
       return values[x][y];
     }
+    const T& at(size_t x, size_t y) const {
+      ceph_assert(x < MaxX);
+      ceph_assert(y < MaxY);
+
+      return values[x][y];
+    }
     size_t get_max_x() const {
       return MaxX;
     }
@@ -1137,6 +1158,11 @@ public:
   }
   void* get_hint_by_dir(std::string_view dirname) const override;
 
+  // intended primarily for UT
+  uint64_t get_max_db_total() const {
+    return per_level_per_dev_max.at(BlueFS::BDEV_DB, per_level_per_dev_usage.get_max_y() - 1);
+  }
+
   void add_usage(void* hint, const bluefs_extent_t& extent) override {
     if (hint == nullptr)
       return;
@@ -1207,6 +1233,7 @@ public:
     const std::string& base,
     BlueFSVolumeSelector::paths& res) const override;
 
+  void reset_history(std::ostream& sout) override;
   void dump(std::ostream& sout) override;
   BlueFSVolumeSelector* clone_empty() const override;
   bool compare(BlueFSVolumeSelector* other) override;
index 237366c63977b7671e4d6134b77c9a4a3ab4de1e..274318b0dd375fbc9d41502b7ef7c3949c612ff3 100644 (file)
@@ -125,10 +125,19 @@ TEST(rocksdb_bluefs_vselector, basic) {
   }
   ASSERT_EQ(2, selector.select_prefer_bdev((void*)slow_bdev));
 
-
-  std::stringstream ss;
-  selector.dump(ss);
-  std::cout << ss.str() << std::endl;
+  {
+    std::stringstream ss;
+    selector.dump(ss);
+    std::cout << ss.str() << std::endl;
+  }
+  {
+    std::stringstream ss;
+    ASSERT_NE(0, selector.get_max_db_total());
+    selector.reset_history(ss);
+    ASSERT_EQ(0, selector.get_max_db_total());
+    selector.dump(ss);
+    std::cout << ss.str() << std::endl;
+  }
 }
 
 int main(int argc, char **argv) {