]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon/OSDMonitor: mon_inject_pg_merge_bounce_probability
authorSage Weil <sage@redhat.com>
Thu, 31 May 2018 18:00:35 +0000 (13:00 -0500)
committerSage Weil <sage@redhat.com>
Fri, 7 Sep 2018 17:09:05 +0000 (12:09 -0500)
Optionally bounce pg_num back up right after we decrease it.  This triggers
conditions in the OSD where the merge and split logic may conflict.

Signed-off-by: Sage Weil <sage@redhat.com>
src/common/options.cc
src/mon/OSDMonitor.cc

index 595497fc4269fc57a91b5681e58a5df75e70fb07..7973c63719ea533be21962fcc8dc701b1993800d 100644 (file)
@@ -1765,6 +1765,10 @@ std::vector<Option> get_global_options() {
     .set_default(0)
     .set_description(""),
 
+    Option("mon_inject_pg_merge_bounce_probability", Option::TYPE_FLOAT, Option::LEVEL_DEV)
+    .set_default(0)
+    .set_description(""),
+
     Option("mon_sync_provider_kill_at", Option::TYPE_INT, Option::LEVEL_DEV)
     .set_default(0)
     .set_description(""),
index e9318a1bb237ecab8798b9bd2fa7df0ece72a1e1..c30a18ee9e5838cc3c49b64e47d6aee6fac1c96b 100644 (file)
@@ -3288,7 +3288,21 @@ bool OSDMonitor::prepare_pg_ready_to_merge(MonOpRequestRef op)
 
   pending_inc.new_pools[m->pgid.pool()] = p;
 
-  wait_for_finished_proposal(op, new C_ReplyMap(this, op, m->version));
+  auto prob = g_conf().get_val<double>("mon_inject_pg_merge_bounce_probability");
+  if (prob > 0 && prob > (double)(rand() % 1000)/1000.0) {
+    derr << __func__ << " injecting pg merge pg_num bounce" << dendl;
+    auto n = new MMonCommand(mon->monmap->get_fsid());
+    n->set_connection(m->get_connection());
+    n->cmd = { "{\"prefix\":\"osd pool set\", \"pool\": \"" +
+              osdmap.get_pool_name(m->pgid.pool()) +
+              "\", \"var\": \"pg_num_actual\", \"val\": \"" +
+              stringify(m->pgid.ps() + 1) + "\"}" };
+    MonOpRequestRef nop = mon->op_tracker.create_request<MonOpRequest>(n);
+    nop->set_type_service();
+    wait_for_finished_proposal(op, new C_RetryMessage(this, nop));
+  } else {
+    wait_for_finished_proposal(op, new C_ReplyMap(this, op, m->version));
+  }
   mon->no_reply(op);
   return true;
 }