From 47afbdae38b00e392cc5da67135db1309e0978fa Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Thu, 28 Apr 2011 12:42:23 -0700 Subject: [PATCH] mon: make 'ceph osd (down,out,in) N' take mulitple osd numbers Signed-off-by: Sage Weil --- src/mon/OSDMonitor.cc | 77 +++++++++++++++++++++++++++++-------------- 1 file changed, 52 insertions(+), 25 deletions(-) diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 235ef64bad012..c58a602ea91b5 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -1417,43 +1417,70 @@ bool OSDMonitor::prepare_command(MMonCommand *m) paxos->wait_for_commit(new Monitor::C_Command(mon, m, 0, rs, paxos->get_version())); return true; } - else if (m->cmd[1] == "down" && m->cmd.size() == 3) { - long osd = strtol(m->cmd[2].c_str(), 0, 10); - if (!osdmap.exists(osd)) { - ss << "osd" << osd << " does not exist"; - } else if (osdmap.is_down(osd)) { - ss << "osd" << osd << " is already down"; - } else { - pending_inc.new_down[osd] = false; - ss << "marked down osd" << osd; + else if (m->cmd[1] == "down" && m->cmd.size() >= 3) { + bool any = false; + for (unsigned j = 2; j < m->cmd.size(); j++) { + long osd = strtol(m->cmd[2].c_str(), 0, 10); + if (!osdmap.exists(osd)) { + ss << "osd" << osd << " does not exist"; + } else if (osdmap.is_down(osd)) { + ss << "osd" << osd << " is already down"; + } else { + pending_inc.new_down[osd] = false; + if (any) + ss << ", osd" << osd; + else + ss << "marked down osd" << osd; + any = true; + } + } + if (any) { getline(ss, rs); paxos->wait_for_commit(new Monitor::C_Command(mon, m, 0, rs, paxos->get_version())); return true; } } else if (m->cmd[1] == "out" && m->cmd.size() == 3) { - long osd = strtol(m->cmd[2].c_str(), 0, 10); - if (!osdmap.exists(osd)) { - ss << "osd" << osd << " does not exist"; - } else if (osdmap.is_out(osd)) { - ss << "osd" << osd << " is already out"; - } else { - pending_inc.new_weight[osd] = CEPH_OSD_OUT; - ss << "marked out osd" << osd; + bool any = false; + for (unsigned j = 2; j < m->cmd.size(); j++) { + long osd = strtol(m->cmd[2].c_str(), 0, 10); + if (!osdmap.exists(osd)) { + ss << "osd" << osd << " does not exist"; + } else if (osdmap.is_out(osd)) { + ss << "osd" << osd << " is already out"; + } else { + pending_inc.new_weight[osd] = CEPH_OSD_OUT; + if (any) + ss << ", osd" << osd; + else + ss << "marked out osd" << osd; + any = true; + } + } + if (any) { getline(ss, rs); paxos->wait_for_commit(new Monitor::C_Command(mon, m, 0, rs, paxos->get_version())); return true; } } else if (m->cmd[1] == "in" && m->cmd.size() == 3) { - long osd = strtol(m->cmd[2].c_str(), 0, 10); - if (osdmap.is_in(osd)) { - ss << "osd" << osd << " is already in"; - } else if (!osdmap.exists(osd)) { - ss << "osd" << osd << " does not exist"; - } else { - pending_inc.new_weight[osd] = CEPH_OSD_IN; - ss << "marked in osd" << osd; + bool any = false; + for (unsigned j = 2; j < m->cmd.size(); j++) { + long osd = strtol(m->cmd[2].c_str(), 0, 10); + if (osdmap.is_in(osd)) { + ss << "osd" << osd << " is already in"; + } else if (!osdmap.exists(osd)) { + ss << "osd" << osd << " does not exist"; + } else { + pending_inc.new_weight[osd] = CEPH_OSD_IN; + if (any) + ss << ", osd" << osd; + else + ss << "marked in osd" << osd; + any = true; + } + } + if (any) { getline(ss, rs); paxos->wait_for_commit(new Monitor::C_Command(mon, m, 0, rs, paxos->get_version())); return true; -- 2.39.5