diff options
author | Sage Weil <sage@inktank.com> | 2013-02-05 14:30:34 -0800 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-02-05 14:30:34 -0800 |
commit | a04d3f0ab165b36172ca9dfb20221645d8085979 (patch) | |
tree | f8209679f58307cc11b25ab67d55bc240be11aa6 | |
parent | 1a386d6c988724c645a2864b6fbb376850d61a2c (diff) | |
download | ceph-a04d3f0ab165b36172ca9dfb20221645d8085979.tar.gz |
mon: 'osd crush rule create-simple <name> <root> <failure_domain_type>'
Simple command to create simple rules.
Signed-off-by: Sage Weil <sage@inktank.com>
-rw-r--r-- | src/mon/OSDMonitor.cc | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index d8fd45bac90..23cebda7c99 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -2412,6 +2412,48 @@ bool OSDMonitor::prepare_command(MMonCommand *m) return true; } } + else if (m->cmd.size() == 7 && + m->cmd[1] == "crush" && + m->cmd[2] == "rule" && + m->cmd[3] == "create-simple") { + string name = m->cmd[4]; + string root = m->cmd[5]; + string type = m->cmd[6]; + + if (osdmap.crush->rule_exists(name)) { + ss << "rule " << name << " already exists"; + 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 << " already exists"; + } else { + int rule = newcrush.add_simple_rule(name, root, type); + if (rule < 0) { + err = rule; + goto out; + } + + pending_inc.crush.clear(); + newcrush.encode(pending_inc.crush); + } + goto out; + } + + 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] == "setmaxosd" && m->cmd.size() > 2) { int newmax = parse_pos_long(m->cmd[2].c_str(), &ss); if (newmax < 0) { |