Skip to content

Commit

Permalink
mon: set ceph osd (down|out|in|rm) error code on failure
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Loic Dachary committed Dec 15, 2013
1 parent 80c6c54 commit 15b8616
Showing 1 changed file with 5 additions and 6 deletions.
11 changes: 5 additions & 6 deletions src/mon/OSDMonitor.cc
Expand Up @@ -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 << ". ";
Expand All @@ -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 << ". ";
Expand All @@ -3587,15 +3584,17 @@ 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 << ". ";
any = true;
}
} 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();
Expand All @@ -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") {
Expand Down

0 comments on commit 15b8616

Please sign in to comment.