From acfebf27d15e37372cb0592b3be6d22c04e02745 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Fri, 19 May 2017 10:25:28 -0400 Subject: [PATCH] mgr,mon: move 'osd {scrub,deep-scrub,repair}' handling to mgr Signed-off-by: Sage Weil --- src/mgr/DaemonServer.cc | 63 ++++++++++++++++++++++++++++++++++++++++- src/mgr/MgrCommands.h | 10 +++++++ src/mon/MonCommands.h | 9 ------ 3 files changed, 72 insertions(+), 10 deletions(-) diff --git a/src/mgr/DaemonServer.cc b/src/mgr/DaemonServer.cc index 19e7bcb6419..07526bae621 100644 --- a/src/mgr/DaemonServer.cc +++ b/src/mgr/DaemonServer.cc @@ -13,8 +13,8 @@ #include "DaemonServer.h" +#include "include/str_list.h" #include "auth/RotatingKeyRing.h" - #include "json_spirit/json_spirit_writer.h" #include "messages/MMgrOpen.h" @@ -613,6 +613,67 @@ bool DaemonServer::handle_command(MCommand *m) << " to " << scrubop; cmdctx->reply(0, ss); return true; + } else if (prefix == "osd scrub" || + prefix == "osd deep-scrub" || + prefix == "osd repair") { + string whostr; + cmd_getval(g_ceph_context, cmdctx->cmdmap, "who", whostr); + vector pvec; + get_str_vec(prefix, pvec); + + set osds; + if (whostr == "*") { + cluster_state.with_osdmap([&](const OSDMap& osdmap) { + for (int i = 0; i < osdmap.get_max_osd(); i++) + if (osdmap.is_up(i)) { + osds.insert(i); + } + }); + } else { + long osd = parse_osd_id(whostr.c_str(), &ss); + if (osd < 0) { + ss << "invalid osd '" << whostr << "'"; + cmdctx->reply(-EINVAL, ss); + return true; + } + cluster_state.with_osdmap([&](const OSDMap& osdmap) { + if (osdmap.is_up(osd)) { + osds.insert(osd); + } + }); + if (osds.empty()) { + ss << "osd." << osd << " is not up"; + cmdctx->reply(-EAGAIN, ss); + return true; + } + } + set sent_osds, failed_osds; + for (auto osd : osds) { + auto p = osd_cons.find(osd); + if (p == osd_cons.end()) { + failed_osds.insert(osd); + } else { + sent_osds.insert(osd); + for (auto& con : p->second) { + con->send_message(new MOSDScrub(monc->get_fsid(), + pvec.back() == "repair", + pvec.back() == "deep-scrub")); + } + } + } + if (failed_osds.size() == osds.size()) { + ss << "failed to instruct osd(s) " << osds << " to " << pvec.back() + << " (not connected)"; + r = -EAGAIN; + } else { + ss << "instructed osd(s) " << sent_osds << " to " << pvec.back(); + if (!failed_osds.empty()) { + ss << "; osd(s) " << failed_osds << " were not connected"; + } + r = 0; + } + cmdctx->reply(0, ss); + return true; } else if (prefix == "osd reweight-by-pg" || prefix == "osd reweight-by-utilization" || prefix == "osd test-reweight-by-pg" || diff --git a/src/mgr/MgrCommands.h b/src/mgr/MgrCommands.h index 17de3a8c7bb..a48aa74b6f3 100644 --- a/src/mgr/MgrCommands.h +++ b/src/mgr/MgrCommands.h @@ -94,3 +94,13 @@ COMMAND("osd test-reweight-by-pg " \ "name=pools,type=CephPoolname,n=N,req=false", \ "dry run of reweight OSDs by PG distribution [overload-percentage-for-consideration, default 120]", \ "osd", "rw", "cli,rest") + +COMMAND("osd scrub " \ + "name=who,type=CephString", \ + "initiate scrub on osd ", "osd", "rw", "cli,rest") +COMMAND("osd deep-scrub " \ + "name=who,type=CephString", \ + "initiate deep scrub on osd ", "osd", "rw", "cli,rest") +COMMAND("osd repair " \ + "name=who,type=CephString", \ + "initiate repair on osd ", "osd", "rw", "cli,rest") diff --git a/src/mon/MonCommands.h b/src/mon/MonCommands.h index 53531054fd0..31edf3e1657 100644 --- a/src/mon/MonCommands.h +++ b/src/mon/MonCommands.h @@ -450,15 +450,6 @@ COMMAND("osd map " \ "name=object,type=CephObjectname " \ "name=nspace,type=CephString,req=false", \ "find pg for in with [namespace]", "osd", "r", "cli,rest") -COMMAND("osd scrub " \ - "name=who,type=CephString", \ - "initiate scrub on osd ", "osd", "rw", "cli,rest") -COMMAND("osd deep-scrub " \ - "name=who,type=CephString", \ - "initiate deep scrub on osd ", "osd", "rw", "cli,rest") -COMMAND("osd repair " \ - "name=who,type=CephString", \ - "initiate repair on osd ", "osd", "rw", "cli,rest") COMMAND("osd lspools " \ "name=auid,type=CephInt,req=false", \ "list pools", "osd", "r", "cli,rest") -- 2.39.5