summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@inktank.com>2013-01-30 01:00:59 -0800
committerSage Weil <sage@inktank.com>2013-02-05 14:31:13 -0800
commit2c559a7ad165d27ad50fcf8301cc140451588c08 (patch)
tree87d3ecca1943a9af0e698327901676e6de93c0dd
parenta19cdd490a78e78021ab5c70bb8bd527d523381f (diff)
downloadceph-2c559a7ad165d27ad50fcf8301cc140451588c08.tar.gz
mon: 'osd crush rule rm <name>'
Signed-off-by: Sage Weil <sage@inktank.com>
-rw-r--r--src/mon/OSDMonitor.cc46
1 files changed, 46 insertions, 0 deletions
diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc
index ff46a6e948e..349773f6d27 100644
--- a/src/mon/OSDMonitor.cc
+++ b/src/mon/OSDMonitor.cc
@@ -2485,9 +2485,55 @@ bool OSDMonitor::prepare_command(MMonCommand *m)
pending_inc.crush.clear();
newcrush.encode(pending_inc.crush);
}
+ getline(ss, rs);
+ paxos->wait_for_commit(new Monitor::C_Command(mon, m, 0, rs, paxos->get_version()));
+ return true;
+ }
+ else if (m->cmd.size() == 5 &&
+ m->cmd[1] == "crush" &&
+ m->cmd[2] == "rule" &&
+ m->cmd[3] == "rm") {
+ string name = m->cmd[4];
+
+ if (!osdmap.crush->rule_exists(name)) {
+ ss << "rule " << name << " does not exist";
+ err = 0;
goto out;
}
+ bufferlist bl;
+ if (pending_inc.crush.length())
+ bl = pending_inc.crush;
+ else
+ osdmap.crush->encode(bl);
+ CrushWrapper newcrush;
+ bufferlist::iterator p = bl.begin();
+ newcrush.decode(p);
+
+ if (!newcrush.rule_exists(name)) {
+ ss << "rule " << name << " does not exist";
+ } else {
+ int ruleno = newcrush.get_rule_id(name);
+ assert(ruleno >= 0);
+
+ // make sure it is not in use.
+ // FIXME: this is ok in some situations, but let's not bother with that
+ // complexity now.
+ int ruleset = newcrush.get_rule_mask_ruleset(ruleno);
+ if (osdmap.crush_ruleset_in_use(ruleset)) {
+ ss << "crush rule " << name << " ruleset " << ruleset << " is in use";
+ err = -EBUSY;
+ goto out;
+ }
+
+ err = newcrush.remove_rule(ruleno);
+ if (err < 0) {
+ goto out;
+ }
+
+ pending_inc.crush.clear();
+ newcrush.encode(pending_inc.crush);
+ }
getline(ss, rs);
paxos->wait_for_commit(new Monitor::C_Command(mon, m, 0, rs, paxos->get_version()));
return true;