From: Loic Dachary Date: Sun, 15 Dec 2013 15:27:02 +0000 (+0100) Subject: mon: set ceph osd (down|out|in|rm) error code on failure X-Git-Tag: v0.75~97^2~4 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=15b8616b13a327701c5d48c6cb7aeab8fcc4cafc;p=ceph.git mon: set ceph osd (down|out|in|rm) error code on failure 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 --- diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 377682aa8c0..a77b155545c 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -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") {