From: xie xingguo Date: Mon, 12 Jun 2017 03:36:10 +0000 (+0800) Subject: mon/OSDMonitor: wildcard support for osd down/out/in/remove commands X-Git-Tag: v12.1.0~143^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=49c9b83a1a14bccbe99cbacf883d15cd5b7dc9b7;p=ceph.git mon/OSDMonitor: wildcard support for osd down/out/in/remove commands 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 --- diff --git a/src/mon/MonCommands.h b/src/mon/MonCommands.h index 19969422f54..b8ac138e8b2 100644 --- a/src/mon/MonCommands.h +++ b/src/mon/MonCommands.h @@ -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) [...] down", "osd", "rw", "cli,rest") + "set osd(s) [...] down, " \ + "or use to set all osds down", \ + "osd", "rw", "cli,rest") COMMAND("osd out " \ "name=ids,type=CephString,n=N", \ - "set osd(s) [...] out", "osd", "rw", "cli,rest") + "set osd(s) [...] out, " \ + "or use to set all osds out", \ + "osd", "rw", "cli,rest") COMMAND("osd in " \ "name=ids,type=CephString,n=N", \ - "set osd(s) [...] in", "osd", "rw", "cli,rest") + "set osd(s) [...] in, " + "can use to automatically set all previously out osds in", \ + "osd", "rw", "cli,rest") COMMAND("osd rm " \ "name=ids,type=CephString,n=N", \ - "remove osd(s) [...]", "osd", "rw", "cli,rest") + "remove osd(s) [...], " + "or use to remove all osds", \ + "osd", "rw", "cli,rest") COMMAND("osd add-noout " \ "name=ids,type=CephString,n=N", \ "mark osd(s) [...] as noout, " \ diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index c5c1cb25ff4..d229e6cbbc2 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -8419,73 +8419,98 @@ bool OSDMonitor::prepare_command_impl(MonOpRequestRef op, prefix == "osd rm") { bool any = false; + bool stop = false; + bool verbose = true; vector 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 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) { diff --git a/src/osd/OSDMap.cc b/src/osd/OSDMap.cc index ced120c592a..c63bc6d04ea 100644 --- a/src/osd/OSDMap.cc +++ b/src/osd/OSDMap.cc @@ -1219,6 +1219,14 @@ void OSDMap::get_up_osds(set& ls) const } } +void OSDMap::get_out_osds(set& 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& st) { unsigned t = state; diff --git a/src/osd/OSDMap.h b/src/osd/OSDMap.h index df58787a37c..5178132abbb 100644 --- a/src/osd/OSDMap.h +++ b/src/osd/OSDMap.h @@ -659,6 +659,7 @@ public: void get_all_osds(set& ls) const; void get_up_osds(set& ls) const; + void get_out_osds(set& ls) const; unsigned get_num_pg_temp() const { return pg_temp->size(); }