diff options
author | Joao Eduardo Luis <joao.luis@inktank.com> | 2013-10-09 14:56:42 +0100 |
---|---|---|
committer | Joao Eduardo Luis <joao.luis@inktank.com> | 2013-10-09 14:56:42 +0100 |
commit | b26a3026ce2ce41ca4d009dd59a0b0e7c48f38fb (patch) | |
tree | 0ba23af96529db80a68e23a26f56ae3e40694c7c | |
parent | 408cd61584c72c0d97b774b3d8f95c6b1b06341a (diff) | |
download | ceph-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.cc | 147 | ||||
-rw-r--r-- | src/mon/OSDMonitor.h | 3 |
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(); |