]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd/osd_types: increasing pg_num_pending is also an interval change
authorSage Weil <sage@redhat.com>
Mon, 17 Sep 2018 12:41:15 +0000 (07:41 -0500)
committerSage Weil <sage@redhat.com>
Thu, 20 Sep 2018 13:35:15 +0000 (08:35 -0500)
If we move into the premerge period (pg_num_pending < pg_num), that is a
new interval.  Moving out again (canceling the merge) is also a new
interval.

Signed-off-by: Sage Weil <sage@redhat.com>
src/osd/osd_types.cc
src/test/osd/types.cc

index 192d2e150d5c65ddb82f7e53015a5947bd9e9d65..49e4e2b19e6b14ac77d2dd0da300effb0c6188de 100644 (file)
@@ -3476,12 +3476,14 @@ bool PastIntervals::is_new_interval(
     old_min_size != new_min_size ||
     old_size != new_size ||
     pgid.is_split(old_pg_num, new_pg_num, 0) ||
-    // pre-merge source
+    // (is or was) pre-merge source
     pgid.is_merge_source(old_pg_num_pending, new_pg_num_pending, 0) ||
+    pgid.is_merge_source(new_pg_num_pending, old_pg_num_pending, 0) ||
     // merge source
     pgid.is_merge_source(old_pg_num, new_pg_num, 0) ||
-    // pre-merge target
+    // (is or was) pre-merge target
     pgid.is_merge_target(old_pg_num_pending, new_pg_num_pending) ||
+    pgid.is_merge_target(new_pg_num_pending, old_pg_num_pending) ||
     // merge target
     pgid.is_merge_target(old_pg_num, new_pg_num) ||
     old_sort_bitwise != new_sort_bitwise ||
index b87638e0ba0d88eaee4e8e27161aeb318e72c290..6aba395c56a8e405b12a94c06f78a8c0d9102048 100644 (file)
@@ -347,6 +347,41 @@ for (unsigned i = 0; i < 4; ++i) {
                                                  &past_intervals));
   }
 
+  //
+  // PG was pre-merge source
+  //
+  {
+    std::shared_ptr<OSDMap> osdmap(new OSDMap());
+    osdmap->set_max_osd(10);
+    osdmap->set_state(osd_id, CEPH_OSD_EXISTS);
+    osdmap->set_epoch(epoch);
+    OSDMap::Incremental inc(epoch + 1);
+    inc.new_pools[pool_id].min_size = min_size;
+    inc.new_pools[pool_id].set_pg_num(pg_num);
+    inc.new_pools[pool_id].set_pg_num_pending(pg_num - 1);
+    osdmap->apply_incremental(inc);
+
+    cout << "pg_num " << pg_num << std::endl;
+    PastIntervals past_intervals;
+
+    ASSERT_TRUE(past_intervals.empty());
+    ASSERT_TRUE(PastIntervals::check_new_interval(old_primary,
+                                                 new_primary,
+                                                 old_acting,
+                                                 new_acting,
+                                                 old_up_primary,
+                                                 new_up_primary,
+                                                 old_up,
+                                                 new_up,
+                                                 same_interval_since,
+                                                 last_epoch_clean,
+                                                 lastmap,  // reverse order!
+                                                 osdmap,
+                                                 pg_t(pg_num - 1, pool_id),
+                                                  recoverable.get(),
+                                                 &past_intervals));
+  }
+
   //
   // PG is merge source
   //
@@ -413,6 +448,39 @@ for (unsigned i = 0; i < 4; ++i) {
                                                  &past_intervals));
   }
 
+  //
+  // PG was pre-merge target
+  //
+  {
+    std::shared_ptr<OSDMap> osdmap(new OSDMap());
+    osdmap->set_max_osd(10);
+    osdmap->set_state(osd_id, CEPH_OSD_EXISTS);
+    osdmap->set_epoch(epoch);
+    OSDMap::Incremental inc(epoch + 1);
+    inc.new_pools[pool_id].min_size = min_size;
+    inc.new_pools[pool_id].set_pg_num_pending(pg_num - 1);
+    osdmap->apply_incremental(inc);
+
+    PastIntervals past_intervals;
+
+    ASSERT_TRUE(past_intervals.empty());
+    ASSERT_TRUE(PastIntervals::check_new_interval(old_primary,
+                                                 new_primary,
+                                                 old_acting,
+                                                 new_acting,
+                                                 old_up_primary,
+                                                 new_up_primary,
+                                                 old_up,
+                                                 new_up,
+                                                 same_interval_since,
+                                                 last_epoch_clean,
+                                                 lastmap,  // reverse order!
+                                                 osdmap,
+                                                 pg_t(pg_num / 2 - 1, pool_id),
+                                                  recoverable.get(),
+                                                 &past_intervals));
+  }
+
   //
   // PG is merge target
   //