]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon/OSDMonitor: handle ready_to_merge message that cancels the merge
authorSage Weil <sage@redhat.com>
Sat, 15 Sep 2018 19:51:22 +0000 (14:51 -0500)
committerSage Weil <sage@redhat.com>
Thu, 20 Sep 2018 13:35:15 +0000 (08:35 -0500)
Signed-off-by: Sage Weil <sage@redhat.com>
src/messages/MOSDPGReadyToMerge.h
src/mon/OSDMonitor.cc
src/osd/OSD.cc

index b286686b761b7bf40f5d5febb3e1079f2a3d02ae..c07c58f4b3ba1bc8ca7de95ceb9b903d09ff139a 100644 (file)
@@ -8,31 +8,36 @@ class MOSDPGReadyToMerge
 public:
   pg_t pgid;
   epoch_t last_epoch_clean = 0;
+  bool ready = true;
 
   MOSDPGReadyToMerge()
     : MessageInstance(MSG_OSD_PG_READY_TO_MERGE, 0)
   {}
-  MOSDPGReadyToMerge(pg_t p, epoch_t lec, epoch_t v)
+  MOSDPGReadyToMerge(pg_t p, epoch_t lec, bool r, epoch_t v)
     : MessageInstance(MSG_OSD_PG_READY_TO_MERGE, v),
       pgid(p),
-      last_epoch_clean(lec)
+      last_epoch_clean(lec),
+      ready(r)
   {}
   void encode_payload(uint64_t features) override {
     using ceph::encode;
     paxos_encode();
     encode(pgid, payload);
     encode(last_epoch_clean, payload);
+    encode(ready, payload);
   }
   void decode_payload() override {
     bufferlist::const_iterator p = payload.begin();
     paxos_decode(p);
     decode(pgid, p);
     decode(last_epoch_clean, p);
+    decode(ready, p);
   }
   const char *get_type_name() const override { return "osd_pg_ready_to_merge"; }
   void print(ostream &out) const {
     out << get_type_name()
         << "(" << pgid << " lec " << last_epoch_clean
+       << (ready ? " ready" : " NOT READY")
         << " v" << version << ")";
   }
 };
index ac2eb6ee6870b7ae7ba1d2c6eadcdab37d743385..5ef006ee1f41d8eb9b72eb70d6b6cc76bca01d92 100644 (file)
@@ -3295,8 +3295,13 @@ bool OSDMonitor::prepare_pg_ready_to_merge(MonOpRequestRef op)
     return true;
   }
 
-  p.dec_pg_num(m->last_epoch_clean);
-  p.last_change = pending_inc.epoch;
+  if (m->ready) {
+    p.dec_pg_num(m->last_epoch_clean);
+    p.last_change = pending_inc.epoch;
+  } else {
+    // back off the merge attempt!
+    p.set_pg_num_pending(p.get_pg_num());
+  }
 
   // force pre-nautilus clients to resend their ops, since they
   // don't understand pg_num_pending changes form a new interval
@@ -3305,7 +3310,9 @@ bool OSDMonitor::prepare_pg_ready_to_merge(MonOpRequestRef op)
   pending_inc.new_pools[m->pgid.pool()] = p;
 
   auto prob = g_conf().get_val<double>("mon_inject_pg_merge_bounce_probability");
-  if (prob > 0 && prob > (double)(rand() % 1000)/1000.0) {
+  if (m->ready &&
+      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());
index cffc61739436c70f656efeb7749c878dbdae2b41..671034e4be8b2f8202936dff0e3dae45b5fa784c 100644 (file)
@@ -1725,6 +1725,7 @@ void OSDService::_send_ready_to_merge()
       monc->send_mon_message(new MOSDPGReadyToMerge(
                               src,
                               p->second,  // PG's last_epoch_clean
+                              true,
                               osdmap->get_epoch()));
       sent_ready_to_merge_source.insert(src);
     }