]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
mgr,mon: move 'osd {scrub,deep-scrub,repair}' handling to mgr
authorSage Weil <sage@redhat.com>
Fri, 19 May 2017 14:25:28 +0000 (10:25 -0400)
committerSage Weil <sage@redhat.com>
Fri, 2 Jun 2017 17:02:48 +0000 (13:02 -0400)
Signed-off-by: Sage Weil <sage@redhat.com>
src/mgr/DaemonServer.cc
src/mgr/MgrCommands.h
src/mon/MonCommands.h

index 19e7bcb641918273577e87b277633785d0155f0d..07526bae62143d070d3f6651212d16108fb726a3 100644 (file)
@@ -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<string> pvec;
+    get_str_vec(prefix, pvec);
+
+    set<int> 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<int> 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" ||
index 17de3a8c7bba18b6230ae58f8ad62a14ed96875e..a48aa74b6f383f8048de58e1953876b3e4eb7de8 100644 (file)
@@ -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 <who>", "osd", "rw", "cli,rest")
+COMMAND("osd deep-scrub " \
+       "name=who,type=CephString", \
+       "initiate deep scrub on osd <who>", "osd", "rw", "cli,rest")
+COMMAND("osd repair " \
+       "name=who,type=CephString", \
+       "initiate repair on osd <who>", "osd", "rw", "cli,rest")
index 53531054fd0ef8958ce2ade48fcc3710a44dce1c..31edf3e1657399c5bd654748ca318f53309300b7 100644 (file)
@@ -450,15 +450,6 @@ COMMAND("osd map " \
        "name=object,type=CephObjectname " \
        "name=nspace,type=CephString,req=false", \
        "find pg for <object> in <pool> with [namespace]", "osd", "r", "cli,rest")
-COMMAND("osd scrub " \
-       "name=who,type=CephString", \
-       "initiate scrub on osd <who>", "osd", "rw", "cli,rest")
-COMMAND("osd deep-scrub " \
-       "name=who,type=CephString", \
-       "initiate deep scrub on osd <who>", "osd", "rw", "cli,rest")
-COMMAND("osd repair " \
-       "name=who,type=CephString", \
-       "initiate repair on osd <who>", "osd", "rw", "cli,rest")
 COMMAND("osd lspools " \
        "name=auid,type=CephInt,req=false", \
        "list pools", "osd", "r", "cli,rest")