From: Sage Weil Date: Sat, 15 Sep 2018 19:51:22 +0000 (-0500) Subject: mon/OSDMonitor: handle ready_to_merge message that cancels the merge X-Git-Tag: v14.0.1~212^2~4 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=6c6cf6360cb6dd9eecc77ea73f639b1c0c0b1ac5;p=ceph.git mon/OSDMonitor: handle ready_to_merge message that cancels the merge Signed-off-by: Sage Weil --- diff --git a/src/messages/MOSDPGReadyToMerge.h b/src/messages/MOSDPGReadyToMerge.h index b286686b761b7..c07c58f4b3ba1 100644 --- a/src/messages/MOSDPGReadyToMerge.h +++ b/src/messages/MOSDPGReadyToMerge.h @@ -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 << ")"; } }; diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index ac2eb6ee6870b..5ef006ee1f41d 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -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("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()); diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index cffc61739436c..671034e4be8b2 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -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); }