]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
mon/OSDMonitor: wildcard support for osd down/out/in/remove commands
authorxie xingguo <xie.xingguo@zte.com.cn>
Mon, 12 Jun 2017 03:36:10 +0000 (11:36 +0800)
committerxie xingguo <xie.xingguo@zte.com.cn>
Mon, 12 Jun 2017 04:46:53 +0000 (12:46 +0800)
E.g.:
~# ceph osd out all
marked out osd.0. marked out osd.1. marked out osd.2.

~# ceph osd in '*'
marked in osd.0. marked in osd.1. marked in osd.2.

Signed-off-by: xie xingguo <xie.xingguo@zte.com.cn>
src/mon/MonCommands.h
src/mon/OSDMonitor.cc
src/osd/OSDMap.cc
src/osd/OSDMap.h

index 19969422f54b354c063160ab3f9fd998a1ecc386..b8ac138e8b2e6023389eb3e818a30b850bca3a13 100644 (file)
@@ -645,16 +645,24 @@ COMMAND("osd cluster_snap", "take cluster snapshot (disabled)", \
        "osd", "r", "")
 COMMAND("osd down " \
        "type=CephString,name=ids,n=N", \
-       "set osd(s) <id> [<id>...] down", "osd", "rw", "cli,rest")
+       "set osd(s) <id> [<id>...] down, " \
+        "or use <any|all|*> to set all osds down", \
+        "osd", "rw", "cli,rest")
 COMMAND("osd out " \
        "name=ids,type=CephString,n=N", \
-       "set osd(s) <id> [<id>...] out", "osd", "rw", "cli,rest")
+       "set osd(s) <id> [<id>...] out, " \
+        "or use <any|all|*> to set all osds out", \
+        "osd", "rw", "cli,rest")
 COMMAND("osd in " \
        "name=ids,type=CephString,n=N", \
-       "set osd(s) <id> [<id>...] in", "osd", "rw", "cli,rest")
+       "set osd(s) <id> [<id>...] in, "
+        "can use <any|all|*> to automatically set all previously out osds in", \
+        "osd", "rw", "cli,rest")
 COMMAND("osd rm " \
        "name=ids,type=CephString,n=N", \
-       "remove osd(s) <id> [<id>...]", "osd", "rw", "cli,rest")
+       "remove osd(s) <id> [<id>...], "
+        "or use <any|all|*> to remove all osds", \
+        "osd", "rw", "cli,rest")
 COMMAND("osd add-noout " \
         "name=ids,type=CephString,n=N", \
         "mark osd(s) <id> [<id>...] as noout, " \
index c5c1cb25ff479bacbf8be73643b95a9b3b07621b..d229e6cbbc28a7365a58caaa68ca25891f22a4dd 100644 (file)
@@ -8419,73 +8419,98 @@ bool OSDMonitor::prepare_command_impl(MonOpRequestRef op,
             prefix == "osd rm") {
 
     bool any = false;
+    bool stop = false;
+    bool verbose = true;
 
     vector<string> idvec;
     cmd_getval(g_ceph_context, cmdmap, "ids", idvec);
-    for (unsigned j = 0; j < idvec.size(); j++) {
-      long osd = parse_osd_id(idvec[j].c_str(), &ss);
-      if (osd < 0) {
-       ss << "invalid osd id" << osd;
-       err = -EINVAL;
-       continue;
-      } else if (!osdmap.exists(osd)) {
-       ss << "osd." << osd << " does not exist. ";
-       continue;
+    for (unsigned j = 0; j < idvec.size() && !stop; j++) {
+      set<int> osds;
+
+      // wildcard?
+      if (j == 0 &&
+          (idvec[0] == "any" || idvec[0] == "all" || idvec[0] == "*")) {
+        if (prefix == "osd in") {
+          // touch out osds only
+          osdmap.get_out_osds(osds);
+        } else {
+          osdmap.get_all_osds(osds);
+        }
+        stop = true;
+        verbose = false; // so the output is less noisy.
+      } else {
+        long osd = parse_osd_id(idvec[j].c_str(), &ss);
+        if (osd < 0) {
+          ss << "invalid osd id" << osd;
+          err = -EINVAL;
+          continue;
+        } else if (!osdmap.exists(osd)) {
+          ss << "osd." << osd << " does not exist. ";
+          continue;
+        }
+
+        osds.insert(osd);
       }
-      if (prefix == "osd down") {
-       if (osdmap.is_down(osd)) {
-         ss << "osd." << osd << " is already down. ";
-       } else {
-         pending_inc.new_state[osd] = CEPH_OSD_UP;
-         ss << "marked down osd." << osd << ". ";
-         any = true;
-       }
-      } else if (prefix == "osd out") {
-       if (osdmap.is_out(osd)) {
-         ss << "osd." << osd << " is already out. ";
-       } else {
-         pending_inc.new_weight[osd] = CEPH_OSD_OUT;
-         if (osdmap.osd_weight[osd]) {
-           if (pending_inc.new_xinfo.count(osd) == 0) {
-             pending_inc.new_xinfo[osd] = osdmap.osd_xinfo[osd];
-           }
-           pending_inc.new_xinfo[osd].old_weight = osdmap.osd_weight[osd];
+
+      for (auto &osd : osds) {
+        if (prefix == "osd down") {
+         if (osdmap.is_down(osd)) {
+            if (verbose)
+             ss << "osd." << osd << " is already down. ";
+         } else {
+            pending_inc.pending_osd_state_set(osd, CEPH_OSD_UP);
+           ss << "marked down osd." << osd << ". ";
+           any = true;
          }
-         ss << "marked out osd." << osd << ". ";
-         any = true;
-       }
-      } else if (prefix == "osd in") {
-       if (osdmap.is_in(osd)) {
-         ss << "osd." << osd << " is already in. ";
-       } else {
-         if (osdmap.osd_xinfo[osd].old_weight > 0) {
-           pending_inc.new_weight[osd] = osdmap.osd_xinfo[osd].old_weight;
-           if (pending_inc.new_xinfo.count(osd) == 0) {
-             pending_inc.new_xinfo[osd] = osdmap.osd_xinfo[osd];
+        } else if (prefix == "osd out") {
+         if (osdmap.is_out(osd)) {
+            if (verbose)
+             ss << "osd." << osd << " is already out. ";
+         } else {
+           pending_inc.new_weight[osd] = CEPH_OSD_OUT;
+           if (osdmap.osd_weight[osd]) {
+             if (pending_inc.new_xinfo.count(osd) == 0) {
+               pending_inc.new_xinfo[osd] = osdmap.osd_xinfo[osd];
+             }
+             pending_inc.new_xinfo[osd].old_weight = osdmap.osd_weight[osd];
            }
-           pending_inc.new_xinfo[osd].old_weight = 0;
+           ss << "marked out osd." << osd << ". ";
+           any = true;
+         }
+        } else if (prefix == "osd in") {
+         if (osdmap.is_in(osd)) {
+            if (verbose)
+             ss << "osd." << osd << " is already in. ";
          } else {
-           pending_inc.new_weight[osd] = CEPH_OSD_IN;
+           if (osdmap.osd_xinfo[osd].old_weight > 0) {
+             pending_inc.new_weight[osd] = osdmap.osd_xinfo[osd].old_weight;
+             if (pending_inc.new_xinfo.count(osd) == 0) {
+               pending_inc.new_xinfo[osd] = osdmap.osd_xinfo[osd];
+             }
+             pending_inc.new_xinfo[osd].old_weight = 0;
+           } else {
+             pending_inc.new_weight[osd] = CEPH_OSD_IN;
+           }
+           ss << "marked in osd." << osd << ". ";
+           any = true;
          }
-         ss << "marked in osd." << osd << ". ";
-         any = true;
-       }
-      } else if (prefix == "osd rm") {
-        err = prepare_command_osd_remove(osd);
+        } else if (prefix == "osd rm") {
+          err = prepare_command_osd_remove(osd);
 
-        if (err == -EBUSY) {
-         if (any)
-           ss << ", ";
-          ss << "osd." << osd << " is still up; must be down before removal. ";
-       } else {
-          assert(err == 0);
-         if (any) {
-           ss << ", osd." << osd;
-          } else {
-           ss << "removed osd." << osd;
-          }
-         any = true;
-       }
+          if (err == -EBUSY) {
+           if (any)
+             ss << ", ";
+            ss << "osd." << osd << " is still up; must be down before removal. ";
+         } else {
+            assert(err == 0);
+           if (any) {
+             ss << ", osd." << osd;
+            } else {
+             ss << "removed osd." << osd;
+            }
+           any = true;
+         }
+        }
       }
     }
     if (any) {
index ced120c592a3258717b835bb1d76dd3cf7b861ff..c63bc6d04eac0d830758f65c14b3cc266c4bf6cb 100644 (file)
@@ -1219,6 +1219,14 @@ void OSDMap::get_up_osds(set<int32_t>& ls) const
   }
 }
 
+void OSDMap::get_out_osds(set<int32_t>& ls) const
+{
+  for (int i = 0; i < max_osd; i++) {
+    if (is_out(i))
+      ls.insert(i);
+  }
+}
+
 void OSDMap::calc_state_set(int state, set<string>& st)
 {
   unsigned t = state;
index df58787a37c98e9d701201fe842d9452f544b70f..5178132abbb9b02028672cf647e1da76d122f7c3 100644 (file)
@@ -659,6 +659,7 @@ public:
 
   void get_all_osds(set<int32_t>& ls) const;
   void get_up_osds(set<int32_t>& ls) const;
+  void get_out_osds(set<int32_t>& ls) const;
   unsigned get_num_pg_temp() const {
     return pg_temp->size();
   }