]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: set ceph osd (down|out|in|rm) error code on failure
authorLoic Dachary <loic@dachary.org>
Sun, 15 Dec 2013 15:27:02 +0000 (16:27 +0100)
committerLoic Dachary <loic@dachary.org>
Sun, 15 Dec 2013 20:45:31 +0000 (21:45 +0100)
Instead of always returning true, the error code is set if at least one
operation fails.

EINVAL if the OSD id is invalid (osd.foobar for instance).
EBUSY if trying to remove and OSD that is up.

When used with the ceph command line, it looks like this:

    ceph -c ceph.conf osd rm osd.0
    Error EBUSY: osd.0 is still up; must be down before removal.
    kill PID_OF_osd.0
    ceph -c ceph.conf osd down osd.0
    marked down osd.0.
    ceph -c ceph.conf osd rm osd.0 osd.1
    Error EBUSY: removed osd.0, osd.1 is still up; must be down before removal.

http://tracker.ceph.com/issues/6824 fixes #6824

Signed-off-by: Loic Dachary <loic@dachary.org>
src/mon/OSDMonitor.cc

index 377682aa8c08ecd964f496e4f86e9df122776a24..a77b155545c8347e08775bf3d9a046e1fa89d437 100644 (file)
@@ -3559,17 +3559,15 @@ bool OSDMonitor::prepare_command(MMonCommand *m)
       long osd = parse_osd_id(idvec[j].c_str(), &ss);
       if (osd < 0) {
        ss << "invalid osd id" << osd;
-       // XXX -EINVAL here?
+       err = -EINVAL;
        continue;
       } else if (!osdmap.exists(osd)) {
        ss << "osd." << osd << " does not exist. ";
-       err = 0;
        continue;
       }
       if (prefix == "osd down") {
        if (osdmap.is_down(osd)) {
          ss << "osd." << osd << " is already down. ";
-         err = 0;
        } else {
          pending_inc.new_state[osd] = CEPH_OSD_UP;
          ss << "marked down osd." << osd << ". ";
@@ -3578,7 +3576,6 @@ bool OSDMonitor::prepare_command(MMonCommand *m)
       } else if (prefix == "osd out") {
        if (osdmap.is_out(osd)) {
          ss << "osd." << osd << " is already out. ";
-         err = 0;
        } else {
          pending_inc.new_weight[osd] = CEPH_OSD_OUT;
          ss << "marked out osd." << osd << ". ";
@@ -3587,7 +3584,6 @@ bool OSDMonitor::prepare_command(MMonCommand *m)
       } else if (prefix == "osd in") {
        if (osdmap.is_in(osd)) {
          ss << "osd." << osd << " is already in. ";
-         err = 0;
        } else {
          pending_inc.new_weight[osd] = CEPH_OSD_IN;
          ss << "marked in osd." << osd << ". ";
@@ -3595,7 +3591,10 @@ bool OSDMonitor::prepare_command(MMonCommand *m)
        }
       } else if (prefix == "osd rm") {
        if (osdmap.is_up(osd)) {
+         if (any)
+           ss << ", ";
           ss << "osd." << osd << " is still up; must be down before removal. ";
+         err = -EBUSY;
        } else {
          pending_inc.new_state[osd] = osdmap.get_state(osd);
           pending_inc.new_uuid[osd] = uuid_d();
@@ -3611,7 +3610,7 @@ bool OSDMonitor::prepare_command(MMonCommand *m)
     }
     if (any) {
       getline(ss, rs);
-      wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, get_last_committed()));
+      wait_for_finished_proposal(new Monitor::C_Command(mon, m, err, rs, get_last_committed()));
       return true;
     }
   } else if (prefix == "osd reweight") {