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;
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);
}
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();
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")
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";