"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, " \
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) {