]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: add command osd pool clear-availability-status
authorShraddha Agrawal <shraddha.agrawal000@gmail.com>
Wed, 28 May 2025 05:56:26 +0000 (11:26 +0530)
committerShraddha Agrawal <shraddha.agrawal000@gmail.com>
Mon, 23 Jun 2025 06:30:10 +0000 (12:00 +0530)
This commit adds a new command to allow users to clear the
calculated availability score for a specified pool. This can be
done by issuing the command:

  ceph osd pool clear-availability-status <pool_name>

Fixes: https://tracker.ceph.com/issues/71495
Signed-off-by: Shraddha Agrawal <shraddhaag@ibm.com>
src/mon/MgrStatMonitor.cc
src/mon/MgrStatMonitor.h
src/mon/MonCommands.h
src/mon/OSDMonitor.cc

index 224651a2eb6ee06f2cfdda9b37bedbcb3d8d024d..8379efdd0c13104c5fde9bc75ad27f963e36231b 100644 (file)
@@ -101,6 +101,20 @@ void MgrStatMonitor::create_initial()
   encode(service_map, pending_service_map_bl, CEPH_FEATURES_ALL);
 }
 
+void MgrStatMonitor::clear_pool_availability(int64_t poolid)
+{
+  dout(20) << __func__ << dendl;
+  std::scoped_lock l(lock);
+  auto pool_itr = pending_pool_availability.find(poolid);
+  if (pool_itr != pending_pool_availability.end()) {
+    pool_itr->second = PoolAvailability();
+  } else {
+    dout(1) << "failed to clear a non-existing pool: " << poolid << dendl;
+    return; 
+  };
+  dout(20) << __func__ << " cleared availability score for pool: " << poolid << dendl;
+}
+
 void MgrStatMonitor::calc_pool_availability()
 {
   dout(20) << __func__ << dendl;
@@ -400,6 +414,7 @@ bool MgrStatMonitor::prepare_report(MonOpRequestRef op)
   dout(20) << "pool_availability:\n";
   JSONFormatter jf(true);
   jf.open_object_section("pool_availability");
+  std::scoped_lock l(lock);
   for (auto& i : pending_pool_availability) {
     jf.dump_object(std::to_string(i.first), i.second);
   }
index 5397a1600877f82a07fcc365c52a72e706241aa4..66a184090e9d5b3f9be09a1dd108478ab39925ac 100644 (file)
@@ -58,6 +58,8 @@ public:
   bool enable_availability_tracking = g_conf().get_val<bool>("enable_availability_tracking"); ///< tracking availability score feature 
   std::optional<utime_t> reset_availability_last_uptime_downtime_val;
   
+  void clear_pool_availability(int64_t poolid);
+
   void check_sub(Subscription *sub);
   void check_subs();
   void send_digests();
index 634b17b7ce8213620537640a22192088a6ba284b..dfb58dfb59351443ea2b5eac72e9da7a46c9bde9 100644 (file)
@@ -1246,6 +1246,10 @@ COMMAND("osd pool stretch unset "
 COMMAND("osd pool availability-status", \
         "obtain availability stats from all pools", \
         "osd", "r")
+COMMAND("osd pool clear-availability-status "
+               "name=pool,type=CephPoolname ",
+        "clear a pool's existing availability stats", 
+        "osd", "r")
 COMMAND("osd utilization",
        "get basic pg distribution stats",
        "osd", "r")
index 07b7cdbb64dec983829c75760f2ffa1c68e39a50..52c0e05c3a85fd22c4846af4b48ada179225b716 100644 (file)
@@ -14406,6 +14406,33 @@ bool OSDMonitor::prepare_command_impl(MonOpRequestRef op,
     wait_for_commit(op, new Monitor::C_Command(mon, op, 0, rs,
                                                   get_last_committed() + 1));
     return true;
+  } else if (prefix == "osd pool clear-availability-status") {
+    if (!g_conf().get_val<bool>("enable_availability_tracking")) {
+      ss << "Availability tracking is disabled. Availability status can not be cleared "
+      << "while the feature is disabled. Enable it by setting the config "
+      << "option enable_availability_tracking to ``true`` then try again.";
+      err = -EOPNOTSUPP;
+      goto reply_no_propose;
+    }
+
+    string pool_name;
+    cmd_getval(cmdmap, "pool", pool_name);
+    int64_t pool_id = osdmap.lookup_pg_pool_name(pool_name);
+    // check if pool exists
+    if (pool_id < 0) {
+      ss << "unrecognized pool '" << pool_name << "'";
+      err = -ENOENT;
+      goto reply_no_propose;
+    }
+    std::map<uint64_t, PoolAvailability> pool_availability = mon.mgrstatmon()->get_pool_availability();
+    // check if pool exists in pool_availability
+    if (pool_availability.find(pool_id) == pool_availability.end()){
+      ss << "unrecognized pool '" << pool_name << "'";
+      err = -ENOENT;
+      goto reply_no_propose;
+    }
+    // clear existing calculations
+    mon.mgrstatmon()->clear_pool_availability(pool_id);
   } else if (prefix == "osd pool availability-status") {
     if (!g_conf().get_val<bool>("enable_availability_tracking")) {
       ss << "availability tracking is disabled; you can enable it by setting the config option enable_availability_tracking";