]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
test/crimson/.../test_transaction_manager: test multiple devices
authorYingxin Cheng <yingxin.cheng@intel.com>
Mon, 11 Apr 2022 15:41:46 +0000 (23:41 +0800)
committerYingxin Cheng <yingxin.cheng@intel.com>
Wed, 13 Apr 2022 05:17:11 +0000 (13:17 +0800)
Signed-off-by: Yingxin Cheng <yingxin.cheng@intel.com>
src/test/crimson/seastore/test_transaction_manager.cc
src/test/crimson/seastore/transaction_manager_test_state.h

index 8df37acf73e2480bff3b1aac744c65a8c56a71ab..43d33670378651aba8acfb6a875c8005dffad1d3 100644 (file)
@@ -58,8 +58,8 @@ struct transaction_manager_test_t :
   std::random_device rd;
   std::mt19937 gen;
 
-  transaction_manager_test_t()
-    : gen(rd()) {
+  transaction_manager_test_t(std::size_t num_devices)
+    : TMTestState(num_devices), gen(rd()) {
   }
 
   laddr_t get_random_laddr(size_t block_size, laddr_t limit) {
@@ -605,9 +605,81 @@ struct transaction_manager_test_t :
       }
     );
   }
+
+  void test_random_writes_concurrent() {
+    constexpr unsigned WRITE_STREAMS = 256;
+
+    constexpr size_t TOTAL = 4<<20;
+    constexpr size_t BSIZE = 4<<10;
+    constexpr size_t BLOCKS = TOTAL / BSIZE;
+    run_async([this] {
+      std::for_each(
+        boost::make_counting_iterator(0u),
+        boost::make_counting_iterator(WRITE_STREAMS),
+        [&](auto idx) {
+          for (unsigned i = idx; i < BLOCKS; i += WRITE_STREAMS) {
+            while (true) {
+              auto t = create_transaction();
+              auto extent = alloc_extent(
+                t,
+                i * BSIZE,
+                BSIZE);
+              ASSERT_EQ(i * BSIZE, extent->get_laddr());
+              if (try_submit_transaction(std::move(t)))
+                break;
+            }
+          }
+        });
+
+      int writes = 0;
+      unsigned failures = 0;
+      seastar::parallel_for_each(
+        boost::make_counting_iterator(0u),
+        boost::make_counting_iterator(WRITE_STREAMS),
+        [&](auto) {
+          return seastar::async([&] {
+            while (writes < 300) {
+              auto t = create_transaction();
+              auto ext = try_get_extent(
+                t,
+                get_random_laddr(BSIZE, TOTAL),
+                BSIZE);
+              if (!ext){
+                failures++;
+                continue;
+              }
+              auto mut = mutate_extent(t, ext);
+              auto success = try_submit_transaction(std::move(t));
+              writes += success;
+              failures += !success;
+            }
+          });
+        }).get0();
+      replay();
+      logger().info("random_writes_concurrent: checking");
+      check();
+      logger().info(
+        "random_writes_concurrent: {} suceeded, {} failed",
+        writes,
+        failures
+      );
+    });
+  }
+};
+
+struct tm_single_device_test_t :
+  public transaction_manager_test_t {
+
+  tm_single_device_test_t() : transaction_manager_test_t(1) {}
 };
 
-TEST_F(transaction_manager_test_t, basic)
+struct tm_multi_device_test_t :
+  public transaction_manager_test_t {
+
+  tm_multi_device_test_t() : transaction_manager_test_t(3) {}
+};
+
+TEST_F(tm_single_device_test_t, basic)
 {
   constexpr laddr_t SIZE = 4096;
   run_async([this] {
@@ -628,7 +700,7 @@ TEST_F(transaction_manager_test_t, basic)
   });
 }
 
-TEST_F(transaction_manager_test_t, mutate)
+TEST_F(tm_single_device_test_t, mutate)
 {
   constexpr laddr_t SIZE = 4096;
   run_async([this] {
@@ -666,7 +738,7 @@ TEST_F(transaction_manager_test_t, mutate)
   });
 }
 
-TEST_F(transaction_manager_test_t, allocate_lba_conflict)
+TEST_F(tm_single_device_test_t, allocate_lba_conflict)
 {
   constexpr laddr_t SIZE = 4096;
   run_async([this] {
@@ -699,7 +771,7 @@ TEST_F(transaction_manager_test_t, allocate_lba_conflict)
   });
 }
 
-TEST_F(transaction_manager_test_t, mutate_lba_conflict)
+TEST_F(tm_single_device_test_t, mutate_lba_conflict)
 {
   constexpr laddr_t SIZE = 4096;
   run_async([this] {
@@ -738,7 +810,7 @@ TEST_F(transaction_manager_test_t, mutate_lba_conflict)
   });
 }
 
-TEST_F(transaction_manager_test_t, concurrent_mutate_lba_no_conflict)
+TEST_F(tm_single_device_test_t, concurrent_mutate_lba_no_conflict)
 {
   constexpr laddr_t SIZE = 4096;
   constexpr size_t NUM = 500;
@@ -770,7 +842,7 @@ TEST_F(transaction_manager_test_t, concurrent_mutate_lba_no_conflict)
   });
 }
 
-TEST_F(transaction_manager_test_t, create_remove_same_transaction)
+TEST_F(tm_single_device_test_t, create_remove_same_transaction)
 {
   constexpr laddr_t SIZE = 4096;
   run_async([this] {
@@ -801,7 +873,7 @@ TEST_F(transaction_manager_test_t, create_remove_same_transaction)
   });
 }
 
-TEST_F(transaction_manager_test_t, split_merge_read_same_transaction)
+TEST_F(tm_single_device_test_t, split_merge_read_same_transaction)
 {
   constexpr laddr_t SIZE = 4096;
   run_async([this] {
@@ -831,7 +903,7 @@ TEST_F(transaction_manager_test_t, split_merge_read_same_transaction)
   });
 }
 
-TEST_F(transaction_manager_test_t, inc_dec_ref)
+TEST_F(tm_single_device_test_t, inc_dec_ref)
 {
   constexpr laddr_t SIZE = 4096;
   run_async([this] {
@@ -878,7 +950,7 @@ TEST_F(transaction_manager_test_t, inc_dec_ref)
   });
 }
 
-TEST_F(transaction_manager_test_t, cause_lba_split)
+TEST_F(tm_single_device_test_t, cause_lba_split)
 {
   constexpr laddr_t SIZE = 4096;
   run_async([this] {
@@ -896,7 +968,7 @@ TEST_F(transaction_manager_test_t, cause_lba_split)
   });
 }
 
-TEST_F(transaction_manager_test_t, random_writes)
+TEST_F(tm_single_device_test_t, random_writes)
 {
   constexpr size_t TOTAL = 4<<20;
   constexpr size_t BSIZE = 4<<10;
@@ -939,68 +1011,7 @@ TEST_F(transaction_manager_test_t, random_writes)
   });
 }
 
-TEST_F(transaction_manager_test_t, random_writes_concurrent)
-{
-  constexpr unsigned WRITE_STREAMS = 256;
-
-  constexpr size_t TOTAL = 4<<20;
-  constexpr size_t BSIZE = 4<<10;
-  constexpr size_t BLOCKS = TOTAL / BSIZE;
-  run_async([this] {
-    std::for_each(
-      boost::make_counting_iterator(0u),
-      boost::make_counting_iterator(WRITE_STREAMS),
-      [&](auto idx) {
-       for (unsigned i = idx; i < BLOCKS; i += WRITE_STREAMS) {
-         while (true) {
-           auto t = create_transaction();
-           auto extent = alloc_extent(
-             t,
-             i * BSIZE,
-             BSIZE);
-           ASSERT_EQ(i * BSIZE, extent->get_laddr());
-           if (try_submit_transaction(std::move(t)))
-             break;
-         }
-       }
-      });
-
-    int writes = 0;
-    unsigned failures = 0;
-    seastar::parallel_for_each(
-      boost::make_counting_iterator(0u),
-      boost::make_counting_iterator(WRITE_STREAMS),
-      [&](auto) {
-        return seastar::async([&] {
-          while (writes < 300) {
-            auto t = create_transaction();
-            auto ext = try_get_extent(
-              t,
-              get_random_laddr(BSIZE, TOTAL),
-              BSIZE);
-            if (!ext){
-              failures++;
-              continue;
-            }
-           auto mut = mutate_extent(t, ext);
-           auto success = try_submit_transaction(std::move(t));
-           writes += success;
-           failures += !success;
-         }
-       });
-      }).get0();
-    replay();
-    logger().info("random_writes_concurrent: checking");
-    check();
-    logger().info(
-      "random_writes_concurrent: {} suceeded, {} failed",
-      writes,
-      failures
-    );
-  });
-}
-
-TEST_F(transaction_manager_test_t, find_hole_assert_trigger)
+TEST_F(tm_single_device_test_t, find_hole_assert_trigger)
 {
   constexpr unsigned max = 10;
   constexpr size_t BSIZE = 4<<10;
@@ -1013,6 +1024,14 @@ TEST_F(transaction_manager_test_t, find_hole_assert_trigger)
         return allocate_sequentially(BSIZE, num);
     });
   });
+}
 
+TEST_F(tm_single_device_test_t, random_writes_concurrent)
+{
+  test_random_writes_concurrent();
 }
 
+TEST_F(tm_multi_device_test_t, random_writes_concurrent)
+{
+  test_random_writes_concurrent();
+}
index 73c8872982be244b15c0dc2c392ae715ff6a9832..93fc5af92eb70eddb074f3418e29a5500f22a6d1 100644 (file)
@@ -134,9 +134,16 @@ protected:
 
   TMTestState() : EphemeralTestState(1) {}
 
+  TMTestState(std::size_t num_devices) : EphemeralTestState(num_devices) {}
+
   virtual void _init() override {
     tm = make_transaction_manager(true);
     tm->add_device(segment_manager.get(), true);
+    if (get_num_devices() > 1) {
+      for (auto &sec_sm : secondary_segment_managers) {
+        tm->add_device(sec_sm.get(), false);
+      }
+    }
     segment_cleaner = tm->get_segment_cleaner();
     lba_manager = tm->get_lba_manager();
   }