From: Sage Weil Date: Fri, 16 Nov 2012 00:23:48 +0000 (-0800) Subject: mon: use parse_osd_id() throughout X-Git-Tag: v0.55~75^2~4 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=592a89421f7817d8ff0eb4ceaea2791196137a1f;p=ceph.git mon: use parse_osd_id() throughout Signed-off-by: Sage Weil --- diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index c7e3593d4c73..c0c7b5c99d1a 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -1784,9 +1784,11 @@ bool OSDMonitor::preprocess_command(MMonCommand *m) ss << "ok"; } else { errno = 0; - int who = strtol(m->cmd[0].c_str(), 0, 10); + int who = parse_osd_id(m->cmd[0].c_str(), &ss); m->cmd.erase(m->cmd.begin()); //done with target num now - if (!errno && who >= 0) { + if (who < 0) { + r = -EINVAL; + } else { if (osdmap.is_up(who)) { mon->send_command(osdmap.get_inst(who), m->cmd, paxos->get_version()); r = 0; @@ -1795,7 +1797,7 @@ bool OSDMonitor::preprocess_command(MMonCommand *m) ss << "osd." << who << " not up"; r = -ENOENT; } - } else ss << "specify osd number or *"; + } } } else if (m->cmd[1] == "map" && m->cmd.size() == 4) { @@ -1839,16 +1841,19 @@ bool OSDMonitor::preprocess_command(MMonCommand *m) r = 0; ss << " instructed to " << m->cmd[1]; } else { - long osd = strtol(m->cmd[2].c_str(), 0, 10); - if (osdmap.is_up(osd)) { + long osd = parse_osd_id(m->cmd[2].c_str(), &ss); + if (osd < 0) { + r = -EINVAL; + } else if (osdmap.is_up(osd)) { mon->try_send_message(new MOSDScrub(osdmap.get_fsid(), m->cmd[1] == "repair", m->cmd[1] == "deep-scrub"), osdmap.get_inst(osd)); r = 0; ss << "osd." << osd << " instructed to " << m->cmd[1]; - } else + } else { ss << "osd." << osd << " is not up"; + } } } else if (m->cmd[1] == "lspools") { @@ -2326,8 +2331,10 @@ bool OSDMonitor::prepare_command(MMonCommand *m) 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[j].c_str(), 0, 10); - if (!osdmap.exists(osd)) { + long osd = parse_osd_id(m->cmd[j].c_str(), &ss); + if (osd < 0) { + err = -EINVAL; + } else if (!osdmap.exists(osd)) { ss << "osd." << osd << " does not exist"; } else if (osdmap.is_down(osd)) { ss << "osd." << osd << " is already down"; @@ -2350,8 +2357,10 @@ bool OSDMonitor::prepare_command(MMonCommand *m) else if (m->cmd[1] == "out" && m->cmd.size() >= 3) { bool any = false; for (unsigned j = 2; j < m->cmd.size(); j++) { - long osd = strtol(m->cmd[j].c_str(), 0, 10); - if (!osdmap.exists(osd)) { + long osd = parse_osd_id(m->cmd[j].c_str(), &ss); + if (osd < 0) { + err = -EINVAL; + } else if (!osdmap.exists(osd)) { ss << "osd." << osd << " does not exist"; } else if (osdmap.is_out(osd)) { ss << "osd." << osd << " is already out"; @@ -2374,8 +2383,10 @@ bool OSDMonitor::prepare_command(MMonCommand *m) else if (m->cmd[1] == "in" && m->cmd.size() >= 3) { bool any = false; for (unsigned j = 2; j < m->cmd.size(); j++) { - long osd = strtol(m->cmd[j].c_str(), 0, 10); - if (osdmap.is_in(osd)) { + long osd = parse_osd_id(m->cmd[j].c_str(), &ss); + if (osd < 0) { + err = -EINVAL; + } else if (osdmap.is_in(osd)) { ss << "osd." << osd << " is already in"; err = 0; } else if (!osdmap.exists(osd)) { @@ -2396,22 +2407,25 @@ bool OSDMonitor::prepare_command(MMonCommand *m) } } else if (m->cmd[1] == "reweight" && m->cmd.size() == 4) { - long osd = strtol(m->cmd[2].c_str(), 0, 10); - float w = strtof(m->cmd[3].c_str(), 0); - long ww = (int)((float)CEPH_OSD_IN*w); - if (osdmap.exists(osd)) { - pending_inc.new_weight[osd] = ww; - ss << "reweighted osd." << osd << " to " << w << " (" << ios::hex << ww << ios::dec << ")"; - getline(ss, rs); - paxos->wait_for_commit(new Monitor::C_Command(mon, m, 0, rs, paxos->get_version())); - return true; - } + long osd = parse_osd_id(m->cmd[2].c_str(), &ss); + if (osd < 0) { + err = -EINVAL; + } else { + float w = strtof(m->cmd[3].c_str(), 0); + long ww = (int)((float)CEPH_OSD_IN*w); + if (osdmap.exists(osd)) { + pending_inc.new_weight[osd] = ww; + ss << "reweighted osd." << osd << " to " << w << " (" << ios::hex << ww << ios::dec << ")"; + 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] == "lost" && m->cmd.size() >= 3) { - string err; - int osd = strict_strtol(m->cmd[2].c_str(), 10, &err); - if (!err.empty()) { - ss << err; + int osd = parse_osd_id(m->cmd[2].c_str(), &ss); + if (osd < 0) { + err = -EINVAL; } else if ((m->cmd.size() < 4) || m->cmd[3] != "--yes-i-really-mean-it") { ss << "are you SURE? this might mean real, permanent data loss. pass " @@ -2480,8 +2494,10 @@ bool OSDMonitor::prepare_command(MMonCommand *m) else if (m->cmd[1] == "rm" && m->cmd.size() >= 3) { bool any = false; for (unsigned j = 2; j < m->cmd.size(); j++) { - long osd = strtol(m->cmd[j].c_str(), 0, 10); - if (!osdmap.exists(osd)) { + long osd = parse_osd_id(m->cmd[j].c_str(), &ss); + if (osd < 0) { + err = -EINVAL; + } else if (!osdmap.exists(osd)) { ss << "osd." << osd << " does not exist"; err = 0; } else if (osdmap.is_up(osd)) {