]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: Set crash_replay_interval automatically
authorJohn Spray <john.spray@redhat.com>
Mon, 23 Jun 2014 18:09:54 +0000 (11:09 -0700)
committerJohn Spray <john.spray@redhat.com>
Tue, 1 Jul 2014 17:40:02 +0000 (18:40 +0100)
Signed-off-by: John Spray <john.spray@redhat.com>
src/mon/MDSMonitor.cc
src/mon/OSDMonitor.cc
src/mon/OSDMonitor.h

index 6994fd7095c208616b0a4e8507ef885783298b91..0912ae6dba9b7eb45428900036e66e7a5fa1da33 100644 (file)
@@ -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;
index 9d52edf7a003306ccefb77293f549f8a511c7c81..cee188d3ca190e3e1079092e51aefcfc31d02fa9 100644 (file)
@@ -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<string,cmd_vartype> &cmdmap,
                                          stringstream& ss)
 {
index 80d083e8bd70a8c6f593c00c657ea498fadbfbbe..86691e2c71d92b406122491f4bac626e8d4061b7 100644 (file)
@@ -363,6 +363,7 @@ private:
   bool prepare_command(MMonCommand *m);
   bool prepare_command_impl(MMonCommand *m, map<string,cmd_vartype> &cmdmap);
 
+  int set_crash_replay_interval(const int64_t pool_id, const uint32_t cri);
   int prepare_command_pool_set(map<string,cmd_vartype> &cmdmap,
                                stringstream& ss);