From: Igor Fedotov Date: Mon, 2 Mar 2026 14:10:38 +0000 (+0300) Subject: os/bluestore: add 'bluefs stats reset' admin socket command. X-Git-Tag: v21.0.0~87^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=c1a21a9c00a91f9ecfa0e271b0057227cad22530;p=ceph.git os/bluestore: add 'bluefs stats reset' admin socket command. Which resets historical maximums for BlueFS volume selector. Hence eliminating the need to restart OSD if needed. Signed-off-by: Igor Fedotov --- diff --git a/src/os/bluestore/BlueFS.cc b/src/os/bluestore/BlueFS.cc index d9885d46cc75..61470f7f9a99 100644 --- a/src/os/bluestore/BlueFS.cc +++ b/src/os/bluestore/BlueFS.cc @@ -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(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(); diff --git a/src/os/bluestore/BlueFS.h b/src/os/bluestore/BlueFS.h index 5f676aa27f16..8b766a5ef60d 100644 --- a/src/os/bluestore/BlueFS.h +++ b/src/os/bluestore/BlueFS.h @@ -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; diff --git a/src/test/objectstore/test_bluestore_vselector.cc b/src/test/objectstore/test_bluestore_vselector.cc index 237366c63977..274318b0dd37 100644 --- a/src/test/objectstore/test_bluestore_vselector.cc +++ b/src/test/objectstore/test_bluestore_vselector.cc @@ -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) {