// 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() {
std::map<std::string, std::string> 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();
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";
*/
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;
void DaemonServer::update_task_status(DaemonKey key, const ref_t<MMgrReport>& 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;
}
}