summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoao Eduardo Luis <joao.luis@inktank.com>2013-10-09 14:56:42 +0100
committerJoao Eduardo Luis <joao.luis@inktank.com>2013-10-09 14:56:42 +0100
commitb26a3026ce2ce41ca4d009dd59a0b0e7c48f38fb (patch)
tree0ba23af96529db80a68e23a26f56ae3e40694c7c
parent408cd61584c72c0d97b774b3d8f95c6b1b06341a (diff)
downloadceph-b26a3026ce2ce41ca4d009dd59a0b0e7c48f38fb.tar.gz
mon: OSDMonitor: split 'osd pool set' out of 'prepare_command'
We should start doing this across the whole 'prepare_command' function. Makes it prettier to the reader, and easier to add new code. Signed-off-by: Joao Eduardo Luis <joao.luis@inktank.com>
-rw-r--r--src/mon/OSDMonitor.cc147
-rw-r--r--src/mon/OSDMonitor.h3
2 files changed, 85 insertions, 65 deletions
diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc
index 07022aec73b..2b089fa5335 100644
--- a/src/mon/OSDMonitor.cc
+++ b/src/mon/OSDMonitor.cc
@@ -2574,6 +2574,80 @@ void OSDMonitor::parse_loc_map(const vector<string>& args, map<string,string> *
}
}
+int OSDMonitor::prepare_command_pool_set(const map<string,cmd_vartype> &cmdmap,
+ stringstream& ss)
+{
+ string poolstr;
+ cmd_getval(g_ceph_context, cmdmap, "pool", poolstr);
+ int64_t pool = osdmap.lookup_pg_pool_name(poolstr.c_str());
+ if (pool < 0) {
+ ss << "unrecognized pool '" << poolstr << "'";
+ return -ENOENT;
+ }
+ const pg_pool_t *p = osdmap.get_pg_pool(pool);
+ string var;
+ cmd_getval(g_ceph_context, cmdmap, "var", var);
+ if (pending_inc.new_pools.count(pool) == 0)
+ pending_inc.new_pools[pool] = *p;
+
+ int64_t n;
+ if (var == "size" || var == "min_size" ||
+ var == "crash_replay_interval" || var == "pg_num" ||
+ var == "pgp_num" || var == "crush_ruleset") {
+ cmd_getval(g_ceph_context, cmdmap, "val", n);
+ } else {
+ ss << "unrecognized variable '" << var << "'";
+ return -EINVAL;
+ }
+
+ if (var == "size") {
+ if (n == 0 || n > 10) {
+ ss << "pool size must be between 1 and 10";
+ err = -EINVAL;
+ goto reply;
+ }
+ pending_inc.new_pools[pool].size = n;
+ if (n < p->min_size)
+ pending_inc.new_pools[pool].min_size = n;
+ ss << "set pool " << pool << " size to " << n;
+ } else if (var == "min_size") {
+ pending_inc.new_pools[pool].min_size = n;
+ ss << "set pool " << pool << " min_size to " << n;
+ } else if (var == "crash_replay_interval") {
+ pending_inc.new_pools[pool].crash_replay_interval = n;
+ ss << "set pool " << pool << " to crash_replay_interval to " << n;
+ } else if (var == "pg_num") {
+ if (n <= p->get_pg_num()) {
+ ss << "specified pg_num " << n << " <= current " << p->get_pg_num();
+ } else if (!mon->pgmon()->pg_map.creating_pgs.empty()) {
+ ss << "currently creating pgs, wait";
+ err = -EAGAIN;
+ } else {
+ pending_inc.new_pools[pool].set_pg_num(n);
+ ss << "set pool " << pool << " pg_num to " << n;
+ }
+ } else if (var == "pgp_num") {
+ if (n > p->get_pg_num()) {
+ ss << "specified pgp_num " << n << " > pg_num " << p->get_pg_num();
+ } else if (!mon->pgmon()->pg_map.creating_pgs.empty()) {
+ ss << "still creating pgs, wait";
+ err = -EAGAIN;
+ } else {
+ pending_inc.new_pools[pool].set_pgp_num(n);
+ ss << "set pool " << pool << " pgp_num to " << n;
+ }
+ } else if (var == "crush_ruleset") {
+ if (osdmap.crush->rule_exists(n)) {
+ pending_inc.new_pools[pool].crush_ruleset = n;
+ ss << "set pool " << pool << " crush_ruleset to " << n;
+ } else {
+ ss << "crush ruleset " << n << " does not exist";
+ err = -ENOENT;
+ }
+ }
+ return 0;
+}
+
bool OSDMonitor::prepare_command(MMonCommand *m)
{
bool ret = false;
@@ -3475,71 +3549,14 @@ done:
return true;
}
} else if (prefix == "osd pool set") {
- // set a pool variable to a positive int
- string poolstr;
- cmd_getval(g_ceph_context, cmdmap, "pool", poolstr);
- int64_t pool = osdmap.lookup_pg_pool_name(poolstr.c_str());
- if (pool < 0) {
- ss << "unrecognized pool '" << poolstr << "'";
- err = -ENOENT;
- } else {
- const pg_pool_t *p = osdmap.get_pg_pool(pool);
- int64_t n;
- cmd_getval(g_ceph_context, cmdmap, "val", n);
- string var;
- cmd_getval(g_ceph_context, cmdmap, "var", var);
- if (pending_inc.new_pools.count(pool) == 0)
- pending_inc.new_pools[pool] = *p;
- if (var == "size") {
- if (n == 0 || n > 10) {
- ss << "pool size must be between 1 and 10";
- err = -EINVAL;
- goto reply;
- }
- pending_inc.new_pools[pool].size = n;
- if (n < p->min_size)
- pending_inc.new_pools[pool].min_size = n;
- ss << "set pool " << pool << " size to " << n;
- } else if (var == "min_size") {
- pending_inc.new_pools[pool].min_size = n;
- ss << "set pool " << pool << " min_size to " << n;
- } else if (var == "crash_replay_interval") {
- pending_inc.new_pools[pool].crash_replay_interval = n;
- ss << "set pool " << pool << " to crash_replay_interval to " << n;
- } else if (var == "pg_num") {
- if (n <= p->get_pg_num()) {
- ss << "specified pg_num " << n << " <= current " << p->get_pg_num();
- } else if (!mon->pgmon()->pg_map.creating_pgs.empty()) {
- ss << "currently creating pgs, wait";
- err = -EAGAIN;
- } else {
- pending_inc.new_pools[pool].set_pg_num(n);
- ss << "set pool " << pool << " pg_num to " << n;
- }
- } else if (var == "pgp_num") {
- if (n > p->get_pg_num()) {
- ss << "specified pgp_num " << n << " > pg_num " << p->get_pg_num();
- } else if (!mon->pgmon()->pg_map.creating_pgs.empty()) {
- ss << "still creating pgs, wait";
- err = -EAGAIN;
- } else {
- pending_inc.new_pools[pool].set_pgp_num(n);
- ss << "set pool " << pool << " pgp_num to " << n;
- }
- } else if (var == "crush_ruleset") {
- if (osdmap.crush->rule_exists(n)) {
- pending_inc.new_pools[pool].crush_ruleset = n;
- ss << "set pool " << pool << " crush_ruleset to " << n;
- } else {
- ss << "crush ruleset " << n << " does not exist";
- err = -ENOENT;
- }
- }
- pending_inc.new_pools[pool].last_change = pending_inc.epoch;
- getline(ss, rs);
- wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, get_last_committed()));
- return true;
- }
+ err = prepare_command_pool_set(cmdmap, ss);
+ if (err != 0)
+ goto reply;
+
+ pending_inc.new_pools[pool].last_change = pending_inc.epoch;
+ getline(ss, rs);
+ wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, get_last_committed()));
+
} else if (prefix == "osd pool set-quota") {
string poolstr;
cmd_getval(g_ceph_context, cmdmap, "pool", poolstr);
diff --git a/src/mon/OSDMonitor.h b/src/mon/OSDMonitor.h
index f66c676b53d..0662032c456 100644
--- a/src/mon/OSDMonitor.h
+++ b/src/mon/OSDMonitor.h
@@ -323,6 +323,9 @@ private:
bool preprocess_command(MMonCommand *m);
bool prepare_command(MMonCommand *m);
+ int prepare_command_pool_set(const map<string,cmd_vartype> &cmdmap,
+ stringstream& ss);
+
void handle_osd_timeouts(const utime_t &now,
std::map<int,utime_t> &last_osd_report);
void mark_all_down();