From: Sage Weil Date: Wed, 12 Sep 2018 20:00:09 +0000 (-0500) Subject: osd: send last_epoch_clean when indicating PG is ready to merge X-Git-Tag: v14.0.1~212^2~8 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=142317b2ac36e0b2bd500745dcef8bf871dc49c1;p=ceph-ci.git osd: send last_epoch_clean when indicating PG is ready to merge The mon can put this in the pg_pool_t. Signed-off-by: Sage Weil --- diff --git a/src/messages/MOSDPGReadyToMerge.h b/src/messages/MOSDPGReadyToMerge.h index f0cb8f1daa7..b286686b761 100644 --- a/src/messages/MOSDPGReadyToMerge.h +++ b/src/messages/MOSDPGReadyToMerge.h @@ -7,28 +7,32 @@ class MOSDPGReadyToMerge : public MessageInstance { public: pg_t pgid; + epoch_t last_epoch_clean = 0; MOSDPGReadyToMerge() : MessageInstance(MSG_OSD_PG_READY_TO_MERGE, 0) {} - MOSDPGReadyToMerge(pg_t p, epoch_t e) - : MessageInstance(MSG_OSD_PG_READY_TO_MERGE, e), - pgid(p) + MOSDPGReadyToMerge(pg_t p, epoch_t lec, epoch_t v) + : MessageInstance(MSG_OSD_PG_READY_TO_MERGE, v), + pgid(p), + last_epoch_clean(lec) {} void encode_payload(uint64_t features) override { using ceph::encode; paxos_encode(); encode(pgid, payload); + encode(last_epoch_clean, payload); } void decode_payload() override { bufferlist::const_iterator p = payload.begin(); paxos_decode(p); decode(pgid, p); + decode(last_epoch_clean, p); } const char *get_type_name() const override { return "osd_pg_ready_to_merge"; } void print(ostream &out) const { out << get_type_name() - << "(" << pgid + << "(" << pgid << " lec " << last_epoch_clean << " v" << version << ")"; } }; diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 1159365d369..ac2eb6ee687 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -3295,7 +3295,7 @@ bool OSDMonitor::prepare_pg_ready_to_merge(MonOpRequestRef op) return true; } - p.dec_pg_num(); + p.dec_pg_num(m->last_epoch_clean); p.last_change = pending_inc.epoch; // force pre-nautilus clients to resend their ops, since they diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 57f6d9fa063..b7c6ecac52c 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -1702,11 +1702,11 @@ void OSDService::set_ready_to_merge_source(PG *pg) _send_ready_to_merge(); } -void OSDService::set_ready_to_merge_target(PG *pg) +void OSDService::set_ready_to_merge_target(PG *pg, epoch_t last_epoch_clean) { Mutex::Locker l(merge_lock); dout(10) << __func__ << " " << pg->pg_id << dendl; - ready_to_merge_target.insert(pg->pg_id.pgid); + ready_to_merge_target.insert(make_pair(pg->pg_id.pgid, last_epoch_clean)); _send_ready_to_merge(); } @@ -1719,9 +1719,13 @@ void OSDService::send_ready_to_merge() void OSDService::_send_ready_to_merge() { for (auto src : ready_to_merge_source) { - if (ready_to_merge_target.count(src.get_parent()) && + auto p = ready_to_merge_target.find(src.get_parent()); + if (p != ready_to_merge_target.end() && sent_ready_to_merge_source.count(src) == 0) { - monc->send_mon_message(new MOSDPGReadyToMerge(src, osdmap->get_epoch())); + monc->send_mon_message(new MOSDPGReadyToMerge( + src, + p->second, // PG's last_epoch_clean + osdmap->get_epoch())); sent_ready_to_merge_source.insert(src); } } diff --git a/src/osd/OSD.h b/src/osd/OSD.h index cace749e139..96b060d3f6e 100644 --- a/src/osd/OSD.h +++ b/src/osd/OSD.h @@ -717,11 +717,11 @@ public: // -- pg merge -- Mutex merge_lock = {"OSD::merge_lock"}; set ready_to_merge_source; - set ready_to_merge_target; + map ready_to_merge_target; // pg -> last_epoch_clean set sent_ready_to_merge_source; void set_ready_to_merge_source(PG *pg); - void set_ready_to_merge_target(PG *pg); + void set_ready_to_merge_target(PG *pg, epoch_t last_epoch_clean); void clear_ready_to_merge(PG *pg); void send_ready_to_merge(); void _send_ready_to_merge(); diff --git a/src/osd/PG.cc b/src/osd/PG.cc index 35c33db309c..5dc8d1dc45c 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -7992,7 +7992,8 @@ PG::RecoveryState::Clean::Clean(my_context ctx) if (pg->pool.info.is_pending_merge(pg->info.pgid.pgid, &target)) { if (target) { ldout(pg->cct, 10) << "ready to merge (target)" << dendl; - pg->osd->set_ready_to_merge_target(pg); + pg->osd->set_ready_to_merge_target(pg, + pg->info.history.last_epoch_clean); } else { ldout(pg->cct, 10) << "ready to merge (source)" << dendl; pg->osd->set_ready_to_merge_source(pg); diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index ea6ebb343b2..f20c45e1049 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -1638,8 +1638,9 @@ public: void set_pgp_num_target(int p) { pgp_num_target = p; } - void dec_pg_num() { + void dec_pg_num(epoch_t last_epoch_clean) { --pg_num; + pg_num_dec_last_epoch_clean = last_epoch_clean; calc_pg_masks(); }