]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd/PGLog: force write of may_include_deletes after split 16459/head
authorJosh Durgin <jdurgin@redhat.com>
Thu, 20 Jul 2017 20:27:24 +0000 (16:27 -0400)
committerJosh Durgin <jdurgin@redhat.com>
Thu, 20 Jul 2017 20:27:27 +0000 (16:27 -0400)
When a collection is split this needs to be persisted again. Normally
this is only persisted when the missing set is rebuilt during a new
interval when it previous did not include deletes, but during split we
keep the in-memory missing set may_include_deletes flag, but do not
rebuild the missing set.

Fixes: http://tracker.ceph.com/issues/20704
Signed-off-by: Josh Durgin <jdurgin@redhat.com>
src/osd/PGLog.h
src/test/osd/TestPGLog.cc

index d910bc7f56ad7afaac0c40a64edbeea49c86cbd7..089d4454a89448fb1077ce4e6e5e96921550faa3 100644 (file)
@@ -526,6 +526,9 @@ public:
     mark_dirty_from(eversion_t());
     touched_log = false;
   }
+  bool get_rebuilt_missing_with_deletes() const {
+    return rebuilt_missing_with_deletes;
+  }
 protected:
 
   /// DEBUG
@@ -652,6 +655,8 @@ public:
     missing.split_into(child_pgid, split_bits, &(opg_log->missing));
     opg_log->mark_dirty_to(eversion_t::max());
     mark_dirty_to(eversion_t::max());
+    if (missing.may_include_deletes)
+      opg_log->rebuilt_missing_with_deletes = true;
   }
 
   void recover_got(hobject_t oid, eversion_t v, pg_info_t &info) {
index 1a527db5de509e3f8c4079c3e2ce820626c2f436..182eb425492b7462c869f23d3bf5010a34740216 100644 (file)
@@ -2244,6 +2244,30 @@ TEST_F(PGLogTest, ErrorNotIndexedByObject) {
   EXPECT_EQ(del.reqid, entry->reqid);
 }
 
+TEST_F(PGLogTest, split_into_preserves_may_include_deletes) {
+  clear();
+
+  {
+    rebuilt_missing_with_deletes = false;
+    missing.may_include_deletes = true;
+    PGLog child_log(cct, prefix_provider);
+    pg_t child_pg;
+    split_into(child_pg, 6, &child_log);
+    ASSERT_TRUE(child_log.get_missing().may_include_deletes);
+    ASSERT_TRUE(child_log.get_rebuilt_missing_with_deletes());
+  }
+
+  {
+    rebuilt_missing_with_deletes = false;
+    missing.may_include_deletes = false;
+    PGLog child_log(cct, prefix_provider);
+    pg_t child_pg;
+    split_into(child_pg, 6, &child_log);
+    ASSERT_FALSE(child_log.get_missing().may_include_deletes);
+    ASSERT_FALSE(child_log.get_rebuilt_missing_with_deletes());
+  }
+}
+
 class PGLogTestRebuildMissing : public PGLogTest, public StoreTestFixture {
 public:
   PGLogTestRebuildMissing() : PGLogTest(), StoreTestFixture("memstore") {}
@@ -2323,8 +2347,6 @@ TEST_F(PGLogTestRebuildMissing, MissingNotInLog) {
   run_rebuild_missing_test(expected);
 }
 
-
-
 // Local Variables:
 // compile-command: "cd ../.. ; make unittest_pglog ; ./unittest_pglog --log-to-stderr=true  --debug-osd=20 # --gtest_filter=*.* "
 // End: