]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd/PG: fix not_ready_to_merge behavior for merge target 24226/head
authorSage Weil <sage@redhat.com>
Sat, 22 Sep 2018 16:01:15 +0000 (11:01 -0500)
committerSage Weil <sage@redhat.com>
Mon, 24 Sep 2018 16:03:03 +0000 (11:03 -0500)
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 <sage@redhat.com>
src/osd/OSD.cc
src/osd/OSD.h
src/osd/PG.cc

index 918253a93fe73945affa4cea22d64cd835ccf4c2..4b19739f0406531d6551660de3352ff234a27895 100644 (file)
@@ -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()
index ba64768cf7790b884808aef00dcba5f0d097b2f2..751f3d8218c7f2dd29dfdc0ea6a14d24b0100045 100644 (file)
@@ -719,11 +719,13 @@ public:
   set<pg_t> ready_to_merge_source;
   map<pg_t,epoch_t> ready_to_merge_target;  // pg -> last_epoch_clean
   set<pg_t> not_ready_to_merge_source;
+  map<pg_t,pg_t> not_ready_to_merge_target;
   set<pg_t> 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();
index cbd4fcb6b4fcaf5ddc7acc711a9d5143463917de..24363e0f05fc96302b3fcce7ceb996d4dbafffcd 100644 (file)
@@ -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);
       }