From: Venky Shankar Date: Thu, 23 Apr 2020 06:21:01 +0000 (-0400) Subject: mds: send scrub status to ceph-mgr only when scrub is running X-Git-Tag: v16.1.0~1781^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=5a7d0632d989536e09b2d916b5ea9713dc8dbea5;p=ceph.git mds: send scrub status to ceph-mgr only when scrub is running Signed-off-by: Venky Shankar --- diff --git a/src/mds/MDSRank.cc b/src/mds/MDSRank.cc index 161adeb4d74..5847dc10a33 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 51a87a93597..69455993527 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 da037cabbab..127679b4812 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 1fc57233e39..302948fc206 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; } }