From 142317b2ac36e0b2bd500745dcef8bf871dc49c1 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Wed, 12 Sep 2018 15:00:09 -0500 Subject: [PATCH] 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 --- src/messages/MOSDPGReadyToMerge.h | 12 ++++++++---- src/mon/OSDMonitor.cc | 2 +- src/osd/OSD.cc | 12 ++++++++---- src/osd/OSD.h | 4 ++-- src/osd/PG.cc | 3 ++- src/osd/osd_types.h | 3 ++- 6 files changed, 23 insertions(+), 13 deletions(-) diff --git a/src/messages/MOSDPGReadyToMerge.h b/src/messages/MOSDPGReadyToMerge.h index f0cb8f1daa764..b286686b761b7 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 1159365d3692a..ac2eb6ee6870b 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 57f6d9fa06312..b7c6ecac52c10 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 cace749e139b4..96b060d3f6e56 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 35c33db309cf4..5dc8d1dc45c97 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 ea6ebb343b2c1..f20c45e1049d6 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(); } -- 2.39.5