From 5a7d0632d989536e09b2d916b5ea9713dc8dbea5 Mon Sep 17 00:00:00 2001 From: Venky Shankar Date: Thu, 23 Apr 2020 02:21:01 -0400 Subject: [PATCH] mds: send scrub status to ceph-mgr only when scrub is running Signed-off-by: Venky Shankar --- src/mds/MDSRank.cc | 13 ++++++++++--- src/mds/MDSRank.h | 2 ++ src/mds/ScrubStack.h | 4 ++++ src/mgr/DaemonServer.cc | 18 +++++++++++++++--- 4 files changed, 31 insertions(+), 6 deletions(-) diff --git a/src/mds/MDSRank.cc b/src/mds/MDSRank.cc index 161adeb4d744d..5847dc10a3312 100644 --- a/src/mds/MDSRank.cc +++ b/src/mds/MDSRank.cc @@ -3676,7 +3676,10 @@ void MDSRank::get_task_status(std::map *status) { // scrub summary for now.. std::string_view scrub_summary = scrubstack->scrub_summary(); - status->emplace(SCRUB_STATUS_KEY, std::move(scrub_summary)); + if (!ScrubStack::is_idle(scrub_summary)) { + send_status = true; + status->emplace(SCRUB_STATUS_KEY, std::move(scrub_summary)); + } } void MDSRank::schedule_update_timer_task() { @@ -3692,13 +3695,17 @@ void MDSRank::send_task_status() { std::map status; get_task_status(&status); - if (!status.empty()) { - dout(20) << __func__ << ": updating " << status.size() << " status keys" << dendl; + if (send_status) { + if (status.empty()) { + send_status = false; + } + dout(20) << __func__ << ": updating " << status.size() << " status keys" << dendl; int r = mgrc->service_daemon_update_task_status(std::move(status)); if (r < 0) { derr << ": failed to update service daemon status: " << cpp_strerror(r) << dendl; } + } schedule_update_timer_task(); diff --git a/src/mds/MDSRank.h b/src/mds/MDSRank.h index 51a87a93597ff..69455993527be 100644 --- a/src/mds/MDSRank.h +++ b/src/mds/MDSRank.h @@ -581,6 +581,8 @@ class MDSRank { bool standby_replaying = false; // true if current replay pass is in standby-replay mode private: + bool send_status = true; + // "task" string that gets displayed in ceph status inline static const std::string SCRUB_STATUS_KEY = "scrub status"; diff --git a/src/mds/ScrubStack.h b/src/mds/ScrubStack.h index da037cabbab25..127679b48126f 100644 --- a/src/mds/ScrubStack.h +++ b/src/mds/ScrubStack.h @@ -105,6 +105,10 @@ public: */ std::string_view scrub_summary(); + static bool is_idle(std::string_view state_str) { + return state_str == "idle"; + } + bool is_scrubbing() const { return !inode_stack.empty(); } MDCache *mdcache; diff --git a/src/mgr/DaemonServer.cc b/src/mgr/DaemonServer.cc index 1fc57233e39cd..302948fc2068a 100644 --- a/src/mgr/DaemonServer.cc +++ b/src/mgr/DaemonServer.cc @@ -551,9 +551,21 @@ bool DaemonServer::handle_close(const ref_t& m) void DaemonServer::update_task_status(DaemonKey key, const ref_t& m) { dout(10) << "got task status from " << key << dendl; - auto p = pending_service_map.get_daemon(key.type, key.name); - if (!map_compare(p.first->task_status, *m->task_status)) { - p.first->task_status = *m->task_status; + bool service_map_dirty = false; + if ((*m->task_status).empty()) { + auto removed = pending_service_map.rm_daemon(key.type, key.name); + if (removed) { + service_map_dirty = true; + } + } else { + auto p = pending_service_map.get_daemon(key.type, key.name); + if (!map_compare(p.first->task_status, *m->task_status)) { + service_map_dirty = true; + p.first->task_status = *m->task_status; + } + } + + if (service_map_dirty) { pending_service_map_dirty = pending_service_map.epoch; } } -- 2.39.5