From c0ffa01f1f47caeb3ed35b78b4f602bcdaa94d04 Mon Sep 17 00:00:00 2001 From: John Spray Date: Mon, 23 Jun 2014 11:09:54 -0700 Subject: [PATCH] mon: Set crash_replay_interval automatically Signed-off-by: John Spray --- src/mon/MDSMonitor.cc | 20 +++++++++++--------- src/mon/OSDMonitor.cc | 29 +++++++++++++++++++++++++++++ src/mon/OSDMonitor.h | 1 + 3 files changed, 41 insertions(+), 9 deletions(-) diff --git a/src/mon/MDSMonitor.cc b/src/mon/MDSMonitor.cc index 6994fd7095c20..0912ae6dba9b7 100644 --- a/src/mon/MDSMonitor.cc +++ b/src/mon/MDSMonitor.cc @@ -989,15 +989,7 @@ bool MDSMonitor::management_command( ss << "pool '" << data_name << "' does not exist"; return true; } - - // Warn if crash_replay_interval is not set on the data pool - // (on creation should have done pools[pool].crash_replay_interval = - // cct->_conf->osd_default_data_pool_replay_window;) - pg_pool_t const *data_pool = mon->osdmon()->osdmap.get_pg_pool(data); - if (data_pool->get_crash_replay_interval() == 0) { - ss << "warning: crash_replay_interval not set on data pool '" << data << "', "; - } - + string fs_name; cmd_getval(g_ceph_context, cmdmap, "fs_name", fs_name); if (fs_name.empty()) { @@ -1023,6 +1015,16 @@ bool MDSMonitor::management_command( r = -EINVAL; } + // Automatically set crash_replay_interval on data pool if it + // isn't already set. + pg_pool_t const *data_pool = mon->osdmon()->osdmap.get_pg_pool(data); + assert(data_pool != NULL); // Checked it existed above + if (data_pool->get_crash_replay_interval() == 0) { + r = mon->osdmon()->set_crash_replay_interval(data, g_conf->osd_default_data_pool_replay_window); + assert(r == 0); // We just did get_pg_pool so it must exist and be settable + request_proposal(mon->osdmon()); + } + // All checks passed, go ahead and create. MDSMap newmap; newmap.inc = pending_mdsmap.inc; diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 9d52edf7a0033..cee188d3ca190 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -3309,6 +3309,35 @@ int OSDMonitor::parse_osd_id(const char *s, stringstream *pss) return id; } + +/** + * Special setter for crash_replay_interval on a pool. Equivalent to + * using prepare_command_pool_set, but in a form convenient for use + * from MDSMonitor rather than from an administrative command. + */ +int OSDMonitor::set_crash_replay_interval(const int64_t pool_id, const uint32_t cri) +{ + pg_pool_t p; + if (pending_inc.new_pools.count(pool_id)) { + p = pending_inc.new_pools[pool_id]; + } else { + const pg_pool_t *p_ptr = osdmap.get_pg_pool(pool_id); + if (p_ptr == NULL) { + return -ENOENT; + } else { + p = *p_ptr; + } + } + + dout(10) << "Set pool " << pool_id << " crash_replay_interval=" << cri << dendl; + p.crash_replay_interval = cri; + p.last_change = pending_inc.epoch; + pending_inc.new_pools[pool_id] = p; + + return 0; +} + + int OSDMonitor::prepare_command_pool_set(map &cmdmap, stringstream& ss) { diff --git a/src/mon/OSDMonitor.h b/src/mon/OSDMonitor.h index 80d083e8bd70a..86691e2c71d92 100644 --- a/src/mon/OSDMonitor.h +++ b/src/mon/OSDMonitor.h @@ -363,6 +363,7 @@ private: bool prepare_command(MMonCommand *m); bool prepare_command_impl(MMonCommand *m, map &cmdmap); + int set_crash_replay_interval(const int64_t pool_id, const uint32_t cri); int prepare_command_pool_set(map &cmdmap, stringstream& ss); -- 2.39.5