]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
os/bluestore: Print stats of Runtime and Static Frag Scores using Admin Socket
authorJaya Prakash <jayaprakash@ibm.com>
Tue, 20 Jan 2026 13:53:25 +0000 (13:53 +0000)
committerJaya Prakash <jayaprakash@ibm.com>
Thu, 9 Apr 2026 17:00:02 +0000 (17:00 +0000)
Fixes : https://tracker.ceph.com/issues/74012

Signed-off-by: Jaya Prakash <jayaprakash@ibm.com>
src/os/bluestore/BlueAdmin.cc

index 475d47a16acfb0e11f910068c812bc94eefa7870..4a102a35e31e62fc545329ef794ad3df018b84be 100644 (file)
@@ -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;