]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: use parse_osd_id() throughout
authorSage Weil <sage@inktank.com>
Fri, 16 Nov 2012 00:23:48 +0000 (16:23 -0800)
committerSage Weil <sage@inktank.com>
Fri, 16 Nov 2012 00:32:50 +0000 (16:32 -0800)
Signed-off-by: Sage Weil <sage@inktank.com>
src/mon/OSDMonitor.cc

index c7e3593d4c732756d34a77a3fd898e4cedb302cc..c0c7b5c99d1a2e4052ab275c69d26d88bde7a05f 100644 (file)
@@ -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)) {