]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
test/crimson/seastore: add test case for splitting ObjectDataBlock 45519/head
authorZhang Song <zhangsong325@gmail.com>
Mon, 13 Jun 2022 08:56:28 +0000 (16:56 +0800)
committerZhang Song <zhangsong325@gmail.com>
Mon, 11 Jul 2022 02:23:37 +0000 (10:23 +0800)
Signed-off-by: Zhang Song <zhangsong325@gmail.com>
src/test/crimson/seastore/test_object_data_handler.cc

index 162dc1c19cd684793c30db7c03f3a75a51163a71..0697e13aab3df77e717a4c34509b54061ab7a609 100644 (file)
@@ -135,6 +135,13 @@ struct object_data_handler_test_t:
       }
     }
   }
+  std::list<LBAPinRef> get_mappings(objaddr_t offset, extent_len_t length) {
+    auto t = create_mutate_transaction();
+    auto ret = with_trans_intr(*t, [&](auto &t) {
+      return tm->get_pins(t, offset, length);
+    }).unsafe_get0();
+    return ret;
+  }
 
   seastar::future<> set_up_fut() final {
     onode = new TestOnode(
@@ -306,3 +313,105 @@ TEST_F(object_data_handler_test_t, truncate)
     read(base, 64<<10);
   });
 }
+
+TEST_F(object_data_handler_test_t, no_split) {
+  run_async([this] {
+    write(0, 8<<10, 'x');
+    write(0, 8<<10, 'a');
+
+    auto pins = get_mappings(0, 8<<10);
+    EXPECT_EQ(pins.size(), 1);
+
+    read(0, 8<<10);
+  });
+}
+
+TEST_F(object_data_handler_test_t, split_left) {
+  run_async([this] {
+    write(0, 128<<10, 'x');
+
+    write(64<<10, 60<<10, 'a');
+
+    auto pins = get_mappings(0, 128<<10);
+    EXPECT_EQ(pins.size(), 2);
+
+    size_t res[2] = {0, 64<<10};
+    auto base = pins.front()->get_key();
+    int i = 0;
+    for (auto &pin : pins) {
+      EXPECT_EQ(pin->get_key() - base, res[i]);
+      i++;
+    }
+    read(0, 128<<10);
+  });
+}
+
+TEST_F(object_data_handler_test_t, split_right) {
+  run_async([this] {
+    write(0, 128<<10, 'x');
+    write(4<<10, 60<<10, 'a');
+
+    auto pins = get_mappings(0, 128<<10);
+    EXPECT_EQ(pins.size(), 2);
+
+    size_t res[2] = {0, 64<<10};
+    auto base = pins.front()->get_key();
+    int i = 0;
+    for (auto &pin : pins) {
+      EXPECT_EQ(pin->get_key() - base, res[i]);
+      i++;
+    }
+    read(0, 128<<10);
+  });
+}
+TEST_F(object_data_handler_test_t, split_left_right) {
+  run_async([this] {
+    write(0, 128<<10, 'x');
+    write(48<<10, 32<<10, 'a');
+
+    auto pins = get_mappings(0, 128<<10);
+    EXPECT_EQ(pins.size(), 3);
+
+    size_t res[3] = {0, 48<<10, 80<<10};
+    auto base = pins.front()->get_key();
+    int i = 0;
+    for (auto &pin : pins) {
+      EXPECT_EQ(pin->get_key() - base, res[i]);
+      i++;
+    }
+  });
+}
+TEST_F(object_data_handler_test_t, multiple_split) {
+  run_async([this] {
+    write(0, 128<<10, 'x');
+
+    auto t = create_mutate_transaction();
+    // normal split
+    write(*t, 120<<10, 4<<10, 'a');
+    // not aligned right
+    write(*t, 4<<10, 5<<10, 'b');
+    // split right extent of last split result
+    write(*t, 32<<10, 4<<10, 'c');
+    // non aligned overwrite
+    write(*t, 13<<10, 4<<10, 'd');
+
+    write(*t, 64<<10, 32<<10, 'e');
+    // not split right
+    write(*t, 60<<10, 8<<10, 'f');
+
+    submit_transaction(std::move(t));
+
+    auto pins = get_mappings(0, 128<<10);
+    EXPECT_EQ(pins.size(), 10);
+
+    size_t res[10] = {0, 4<<10, 12<<10, 20<<10, 32<<10,
+                     36<<10, 60<<10, 96<<10, 120<<10, 124<<10};
+    auto base = pins.front()->get_key();
+    int i = 0;
+    for (auto &pin : pins) {
+      EXPECT_EQ(pin->get_key() - base, res[i]);
+      i++;
+    }
+    read(0, 128<<10);
+  });
+}