From: Jaya Prakash Date: Tue, 20 Jan 2026 13:53:25 +0000 (+0000) Subject: os/bluestore: Print stats of Runtime and Static Frag Scores using Admin Socket X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=67ed1f5e7b99cc1246724fbce8e679f8b1e6bd0e;p=ceph.git os/bluestore: Print stats of Runtime and Static Frag Scores using Admin Socket Fixes : https://tracker.ceph.com/issues/74012 Signed-off-by: Jaya Prakash --- diff --git a/src/os/bluestore/BlueAdmin.cc b/src/os/bluestore/BlueAdmin.cc index 475d47a16acf..4a102a35e31e 100644 --- a/src/os/bluestore/BlueAdmin.cc +++ b/src/os/bluestore/BlueAdmin.cc @@ -49,6 +49,30 @@ BlueStore::SocketHook::SocketHook(BlueStore& store) this, "print compression stats, per collection"); ceph_assert(r == 0); + r = admin_socket->register_command( + "bluestore runtime frag score " + "name=collection,type=CephString,req=false", + this, + "print runtime fragmentation score, per collection"); + ceph_assert(r == 0); + r = admin_socket->register_command( + "bluestore clear runtime frag " + "name=collection,type=CephString,req=false", + this, + "clear runtime fragmentation score, per collection"); + ceph_assert(r == 0); + r = admin_socket->register_command( + "bluestore static frag score " + "name=collection,type=CephString,req=false", + this, + "print static fragmentation score, per collection"); + ceph_assert(r == 0); + r = admin_socket->register_command( + "bluestore clear static frag " + "name=collection,type=CephString,req=false", + this, + "clear static fragmentation score, per collection"); + ceph_assert(r == 0); r = admin_socket->register_command( "bluestore show sharding ", this, @@ -192,6 +216,77 @@ int BlueStore::SocketHook::call( ss << "Failed to get sharding" << std::endl; } return r; + } else if (command == "bluestore runtime frag score") { + std::shared_lock l(store.coll_lock); + std::string coll; + cmd_getval(cmdmap, "collection", coll); + f->open_array_section("runtime_frag_score"); + for (const auto& it : store.coll_map) { + auto c = it.second; + std::shared_lock l(c->lock); + if (coll.empty() || coll == c->get_cid().c_str()) { + f->open_object_section("collection"); + f->dump_string("cid", c->get_cid().c_str()); + auto samples = c->runtime_read_samples.load(std::memory_order_relaxed); + auto sum = c->runtime_frag_count.load(std::memory_order_relaxed); + f->dump_unsigned("object_read_samples", samples); + f->dump_unsigned("runtime_frag_count", sum); + if (samples == 0) { + f->dump_int("runtime_frag_score", 0); + } else { + f->dump_float("runtime_frag_score", (float)sum / samples); + } + f->close_section(); + } + } + f->close_section(); + return 0; + } else if (command == "bluestore clear runtime frag") { + std::shared_lock l(store.coll_lock); + std::string coll; + cmd_getval(cmdmap, "collection", coll); + for (const auto& it : store.coll_map) { + auto c = it.second; + std::shared_lock l(c->lock); + if (coll.empty() || coll == c->get_cid().c_str()) { + c->runtime_frag_count.store(0, std::memory_order_relaxed); + c->runtime_read_samples.store(0, std::memory_order_relaxed); + } + } + return 0; + } else if (command == "bluestore static frag score") { + std::shared_lock l(store.coll_lock); + std::string coll; + cmd_getval(cmdmap, "collection", coll); + f->open_array_section("static_frag_score"); + for (const auto& it : store.coll_map) { + auto c = it.second; + std::shared_lock l(c->lock); + if (coll.empty() || coll == c->get_cid().c_str()) { + f->open_object_section("collection"); + f->dump_string("cid", c->get_cid().c_str()); + auto score = c->static_frag_score.load(std::memory_order_relaxed); + auto count = c->object_read_samples.load(std::memory_order_relaxed); + f->dump_unsigned("static_frag_score", score); + f->dump_unsigned("object_read_samples", count); + f->close_section(); + } + } + f->close_section(); + return 0; + } else if (command == "bluestore clear static frag") { + std::shared_lock l(store.coll_lock); + std::string coll; + cmd_getval(cmdmap, "collection", coll); + for (const auto& it : store.coll_map) { + auto c = it.second; + std::shared_lock l(c->lock); + if (coll.empty() || coll == c->get_cid().c_str()) { + c->static_frag_score.store(0, std::memory_order_relaxed); + c->object_read_samples.store(0, std::memory_order_relaxed); + } + } + return 0; } else { ss << "Invalid command" << std::endl; r = -ENOSYS;