From f6aed0b45efc60a8ca81bd3455c14a13106dd3c9 Mon Sep 17 00:00:00 2001 From: Shraddha Agrawal Date: Wed, 28 May 2025 11:26:26 +0530 Subject: [PATCH] mon: add command osd pool clear-availability-status 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 Fixes: https://tracker.ceph.com/issues/71495 Signed-off-by: Shraddha Agrawal --- src/mon/MgrStatMonitor.cc | 15 +++++++++++++++ src/mon/MgrStatMonitor.h | 2 ++ src/mon/MonCommands.h | 4 ++++ src/mon/OSDMonitor.cc | 27 +++++++++++++++++++++++++++ 4 files changed, 48 insertions(+) diff --git a/src/mon/MgrStatMonitor.cc b/src/mon/MgrStatMonitor.cc index 224651a2eb6ee..8379efdd0c131 100644 --- a/src/mon/MgrStatMonitor.cc +++ b/src/mon/MgrStatMonitor.cc @@ -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); } diff --git a/src/mon/MgrStatMonitor.h b/src/mon/MgrStatMonitor.h index 5397a1600877f..66a184090e9d5 100644 --- a/src/mon/MgrStatMonitor.h +++ b/src/mon/MgrStatMonitor.h @@ -58,6 +58,8 @@ public: bool enable_availability_tracking = g_conf().get_val("enable_availability_tracking"); ///< tracking availability score feature std::optional reset_availability_last_uptime_downtime_val; + void clear_pool_availability(int64_t poolid); + void check_sub(Subscription *sub); void check_subs(); void send_digests(); diff --git a/src/mon/MonCommands.h b/src/mon/MonCommands.h index 634b17b7ce821..dfb58dfb59351 100644 --- a/src/mon/MonCommands.h +++ b/src/mon/MonCommands.h @@ -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") diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 07b7cdbb64dec..52c0e05c3a85f 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -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("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 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("enable_availability_tracking")) { ss << "availability tracking is disabled; you can enable it by setting the config option enable_availability_tracking"; -- 2.39.5