From: Sage Weil Date: Sat, 22 Sep 2018 16:01:15 +0000 (-0500) Subject: osd/PG: fix not_ready_to_merge behavior for merge target X-Git-Tag: v14.0.1~190^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=fcb1679eab4240c046ba922060c20423fb35ce43;p=ceph-ci.git osd/PG: fix not_ready_to_merge behavior for merge target Track the *target* not being ready to merge independently from the source, so that we do not have two PGs fighting over the state of not_ready_ready_to_merge_source, and so that the map reflects the *source* PGs readiness only. Signed-off-by: Sage Weil --- diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 918253a93fe..4b19739f040 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -1699,6 +1699,7 @@ void OSDService::set_ready_to_merge_source(PG *pg) Mutex::Locker l(merge_lock); dout(10) << __func__ << " " << pg->pg_id << dendl; ready_to_merge_source.insert(pg->pg_id.pgid); + assert(not_ready_to_merge_source.count(pg->pg_id.pgid) == 0); _send_ready_to_merge(); } @@ -1707,14 +1708,25 @@ 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(make_pair(pg->pg_id.pgid, last_epoch_clean)); + assert(not_ready_to_merge_target.count(pg->pg_id.pgid) == 0); _send_ready_to_merge(); } -void OSDService::set_not_ready_to_merge_source(pg_t pgid) +void OSDService::set_not_ready_to_merge_source(pg_t source) { Mutex::Locker l(merge_lock); - dout(10) << __func__ << " " << pgid << dendl; - not_ready_to_merge_source.insert(pgid); + dout(10) << __func__ << " " << source << dendl; + not_ready_to_merge_source.insert(source); + assert(ready_to_merge_source.count(source) == 0); + _send_ready_to_merge(); +} + +void OSDService::set_not_ready_to_merge_target(pg_t target, pg_t source) +{ + Mutex::Locker l(merge_lock); + dout(10) << __func__ << " " << target << " source " << source << dendl; + not_ready_to_merge_target[target] = source; + assert(ready_to_merge_target.count(target) == 0); _send_ready_to_merge(); } @@ -1726,6 +1738,13 @@ void OSDService::send_ready_to_merge() void OSDService::_send_ready_to_merge() { + dout(20) << __func__ + << " ready_to_merge_source " << ready_to_merge_source + << " not_ready_to_merge_source " << not_ready_to_merge_source + << " ready_to_merge_target " << ready_to_merge_target + << " not_ready_to_merge_target " << not_ready_to_merge_target + << " sent_ready_to_merge_source " << sent_ready_to_merge_source + << dendl; for (auto src : not_ready_to_merge_source) { if (sent_ready_to_merge_source.count(src) == 0) { monc->send_mon_message(new MOSDPGReadyToMerge( @@ -1736,8 +1755,19 @@ void OSDService::_send_ready_to_merge() sent_ready_to_merge_source.insert(src); } } + for (auto p : not_ready_to_merge_target) { + if (sent_ready_to_merge_source.count(p.second) == 0) { + monc->send_mon_message(new MOSDPGReadyToMerge( + p.second, + 0, + false, + osdmap->get_epoch())); + sent_ready_to_merge_source.insert(p.second); + } + } for (auto src : ready_to_merge_source) { - if (not_ready_to_merge_source.count(src)) { + if (not_ready_to_merge_source.count(src) || + not_ready_to_merge_target.count(src.get_parent())) { continue; } auto p = ready_to_merge_target.find(src.get_parent()); @@ -1760,6 +1790,8 @@ void OSDService::clear_ready_to_merge(PG *pg) ready_to_merge_source.erase(pg->pg_id.pgid); ready_to_merge_target.erase(pg->pg_id.pgid); not_ready_to_merge_source.erase(pg->pg_id.pgid); + not_ready_to_merge_target.erase(pg->pg_id.pgid); + sent_ready_to_merge_source.erase(pg->pg_id.pgid); } void OSDService::clear_sent_ready_to_merge() diff --git a/src/osd/OSD.h b/src/osd/OSD.h index ba64768cf77..751f3d8218c 100644 --- a/src/osd/OSD.h +++ b/src/osd/OSD.h @@ -719,11 +719,13 @@ public: set ready_to_merge_source; map ready_to_merge_target; // pg -> last_epoch_clean set not_ready_to_merge_source; + map not_ready_to_merge_target; set sent_ready_to_merge_source; void set_ready_to_merge_source(PG *pg); void set_ready_to_merge_target(PG *pg, epoch_t last_epoch_clean); - void set_not_ready_to_merge_source(pg_t pgid); + void set_not_ready_to_merge_source(pg_t source); + void set_not_ready_to_merge_target(pg_t target, pg_t source); 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 cbd4fcb6b4f..24363e0f05f 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -8430,7 +8430,7 @@ boost::statechart::result PG::RecoveryState::Active::react(const AllReplicasActi pg_t src = pgid; src.set_ps(pg->pool.info.get_pg_num_pending()); assert(src.get_parent() == pgid); - pg->osd->set_not_ready_to_merge_source(src); + pg->osd->set_not_ready_to_merge_target(pgid, src); } else { pg->osd->set_not_ready_to_merge_source(pgid); }