]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
test/crimson/seastore: extract common test logic for transaction_maanager initialization
authorSamuel Just <sjust@redhat.com>
Wed, 14 Oct 2020 07:13:40 +0000 (00:13 -0700)
committerSamuel Just <sjust@redhat.com>
Tue, 20 Oct 2020 19:27:12 +0000 (12:27 -0700)
This should make it somewhat easier to avoid breaking tests that
depend on transaction_manager.

Signed-off-by: Samuel Just <sjust@redhat.com>
src/test/crimson/seastore/test_extmap_manager.cc
src/test/crimson/seastore/test_transaction_manager.cc
src/test/crimson/seastore/transaction_manager_test_state.h [new file with mode: 0644]

index bb18fe69496f404405819ff9ca84027e25e612ef..bdee91bbe766718edc366484d9fb314b46024b6b 100644 (file)
@@ -2,6 +2,7 @@
 // vim: ts=8 sw=2 smarttab
 
 #include "test/crimson/gtest_seastar.h"
+#include "test/crimson/seastore/transaction_manager_test_state.h"
 
 #include "crimson/os/seastore/cache.h"
 #include "crimson/os/seastore/transaction_manager.h"
@@ -21,48 +22,26 @@ namespace {
 }
 
 
-struct extentmap_manager_test_t : public seastar_test_suite_t {
-  std::unique_ptr<SegmentManager> segment_manager;
-  SegmentCleaner segment_cleaner;
-  Journal journal;
-  Cache cache;
-  LBAManagerRef lba_manager;
-  TransactionManager tm;
+struct extentmap_manager_test_t :
+  public seastar_test_suite_t,
+  TMTestState {
+
   ExtentMapManagerRef extmap_manager;
 
-  extentmap_manager_test_t()
-    : segment_manager(create_ephemeral(segment_manager::DEFAULT_TEST_EPHEMERAL)),
-      segment_cleaner(SegmentCleaner::config_t::default_from_segment_manager(
-                       *segment_manager)),
-      journal(*segment_manager),
-      cache(*segment_manager),
-      lba_manager(
-       lba_manager::create_lba_manager(*segment_manager, cache)),
-      tm(*segment_manager, segment_cleaner, journal, cache, *lba_manager),
-      extmap_manager(
-        extentmap_manager::create_extentmap_manager(tm)) {
-    journal.set_segment_provider(&segment_cleaner);
-    segment_cleaner.set_extent_callback(&tm);
-  }
+  extentmap_manager_test_t() {}
 
   seastar::future<> set_up_fut() final {
-    return segment_manager->init().safe_then([this] {
-      return tm.mkfs();
-    }).safe_then([this] {
-      return tm.mount();
-    }).handle_error(
-      crimson::ct_error::all_same_way([] {
-       ASSERT_FALSE("Unable to mount");
-      })
-    );
+    return tm_setup().then([this] {
+      extmap_manager = extentmap_manager::create_extentmap_manager(*tm);
+      return seastar::now();
+    });
   }
 
   seastar::future<> tear_down_fut() final {
-    return tm.close().handle_error(
-      crimson::ct_error::all_same_way([] {
-       ASSERT_FALSE("Unable to close");
-      })
-    );
+    return tm_teardown().then([this] {
+      extmap_manager.reset();
+      return seastar::now();
+    });
   }
 
   using test_extmap_t = std::map<uint32_t, lext_map_val_t>;
@@ -124,7 +103,7 @@ struct extentmap_manager_test_t : public seastar_test_suite_t {
   }
 
   void check_mappings(extmap_root_t &extmap_root) {
-    auto t = tm.create_transaction();
+    auto t = tm->create_transaction();
     check_mappings(extmap_root, *t);
   }
 
@@ -135,33 +114,33 @@ TEST_F(extentmap_manager_test_t, basic)
   run_async([this] {
     extmap_root_t extmap_root(0, L_ADDR_NULL);
     {
-      auto t = tm.create_transaction();
+      auto t = tm->create_transaction();
       extmap_root = extmap_manager->initialize_extmap(*t).unsafe_get0();
-      tm.submit_transaction(std::move(t)).unsafe_get();
+      tm->submit_transaction(std::move(t)).unsafe_get();
     }
 
     uint32_t len = 4096;
     uint32_t lo = 0x1 * len;
     {
-      auto t = tm.create_transaction();
+      auto t = tm->create_transaction();
       logger().debug("first transaction");
       [[maybe_unused]] auto addref = insert_extent(extmap_root, *t, lo, {lo, len});
       [[maybe_unused]] auto seekref = find_extent(extmap_root, *t, lo, len);
-      tm.submit_transaction(std::move(t)).unsafe_get();
+      tm->submit_transaction(std::move(t)).unsafe_get();
     }
     {
-      auto t = tm.create_transaction();
+      auto t = tm->create_transaction();
       logger().debug("second transaction");
       auto seekref = find_extent(extmap_root, *t, lo, len);
       rm_extent(extmap_root, *t, lo, {seekref.front().laddr, len});
       [[maybe_unused]] auto seekref2 = findno_extent(extmap_root, *t, lo, len);
-      tm.submit_transaction(std::move(t)).unsafe_get();
+      tm->submit_transaction(std::move(t)).unsafe_get();
     }
     {
-      auto t = tm.create_transaction();
+      auto t = tm->create_transaction();
       logger().debug("third transaction");
       [[maybe_unused]] auto seekref = findno_extent(extmap_root, *t, lo, len);
-      tm.submit_transaction(std::move(t)).unsafe_get();
+      tm->submit_transaction(std::move(t)).unsafe_get();
     }
   });
 }
@@ -171,14 +150,14 @@ TEST_F(extentmap_manager_test_t, force_split)
   run_async([this] {
     extmap_root_t extmap_root(0, L_ADDR_NULL);
     {
-      auto t = tm.create_transaction();
+      auto t = tm->create_transaction();
       extmap_root = extmap_manager->initialize_extmap(*t).unsafe_get0();
-      tm.submit_transaction(std::move(t)).unsafe_get();
+      tm->submit_transaction(std::move(t)).unsafe_get();
     }
     uint32_t len = 4096;
     uint32_t lo = 0;
     for (unsigned i = 0; i < 40; i++) {
-      auto t = tm.create_transaction();
+      auto t = tm->create_transaction();
       logger().debug("opened transaction");
       for (unsigned j = 0; j < 10; ++j) {
         [[maybe_unused]] auto addref = insert_extent(extmap_root, *t, lo, {lo, len});
@@ -188,7 +167,7 @@ TEST_F(extentmap_manager_test_t, force_split)
         }
       }
       logger().debug("force split submit transaction i = {}", i);
-      tm.submit_transaction(std::move(t)).unsafe_get();
+      tm->submit_transaction(std::move(t)).unsafe_get();
       check_mappings(extmap_root);
     }
   });
@@ -200,14 +179,14 @@ TEST_F(extentmap_manager_test_t, force_split_merge)
   run_async([this] {
     extmap_root_t extmap_root(0, L_ADDR_NULL);
     {
-      auto t = tm.create_transaction();
+      auto t = tm->create_transaction();
       extmap_root = extmap_manager->initialize_extmap(*t).unsafe_get0();
-      tm.submit_transaction(std::move(t)).unsafe_get();
+      tm->submit_transaction(std::move(t)).unsafe_get();
     }
     uint32_t len = 4096;
     uint32_t lo = 0;
     for (unsigned i = 0; i < 80; i++) {
-      auto t = tm.create_transaction();
+      auto t = tm->create_transaction();
       logger().debug("opened split_merge transaction");
       for (unsigned j = 0; j < 5; ++j) {
         [[maybe_unused]] auto addref = insert_extent(extmap_root, *t, lo, {lo, len});
@@ -217,12 +196,12 @@ TEST_F(extentmap_manager_test_t, force_split_merge)
        }
       }
       logger().debug("submitting transaction");
-      tm.submit_transaction(std::move(t)).unsafe_get();
+      tm->submit_transaction(std::move(t)).unsafe_get();
       if (i % 50 == 0) {
        check_mappings(extmap_root);
       }
     }
-    auto t = tm.create_transaction();
+    auto t = tm->create_transaction();
     int i = 0;
     for (const auto& [lo, ext]: test_ext_mappings) {
       if (i % 3 != 0) {
@@ -231,8 +210,8 @@ TEST_F(extentmap_manager_test_t, force_split_merge)
 
       if (i % 10 == 0) {
         logger().debug("submitting transaction i= {}", i);
-       tm.submit_transaction(std::move(t)).unsafe_get();
-       t = tm.create_transaction();
+       tm->submit_transaction(std::move(t)).unsafe_get();
+       t = tm->create_transaction();
       }
       if (i % 100 == 0) {
         logger().debug("check_mappings  i= {}", i);
@@ -242,7 +221,7 @@ TEST_F(extentmap_manager_test_t, force_split_merge)
       i++;
     }
     logger().debug("finally submitting transaction ");
-    tm.submit_transaction(std::move(t)).unsafe_get();
+    tm->submit_transaction(std::move(t)).unsafe_get();
   });
 }
 
@@ -251,14 +230,14 @@ TEST_F(extentmap_manager_test_t, force_split_balanced)
   run_async([this] {
     extmap_root_t extmap_root(0, L_ADDR_NULL);
     {
-      auto t = tm.create_transaction();
+      auto t = tm->create_transaction();
       extmap_root = extmap_manager->initialize_extmap(*t).unsafe_get0();
-      tm.submit_transaction(std::move(t)).unsafe_get();
+      tm->submit_transaction(std::move(t)).unsafe_get();
     }
     uint32_t len = 4096;
     uint32_t lo = 0;
     for (unsigned i = 0; i < 50; i++) {
-      auto t = tm.create_transaction();
+      auto t = tm->create_transaction();
       logger().debug("opened split_merge transaction");
       for (unsigned j = 0; j < 5; ++j) {
         [[maybe_unused]] auto addref = insert_extent(extmap_root, *t, lo, {lo, len});
@@ -268,12 +247,12 @@ TEST_F(extentmap_manager_test_t, force_split_balanced)
         }
       }
       logger().debug("submitting transaction");
-      tm.submit_transaction(std::move(t)).unsafe_get();
+      tm->submit_transaction(std::move(t)).unsafe_get();
       if (i % 50 == 0) {
         check_mappings(extmap_root);
       }
     }
-    auto t = tm.create_transaction();
+    auto t = tm->create_transaction();
     int i = 0;
     for (const auto& [lo, ext]: test_ext_mappings) {
       if (i < 100) {
@@ -282,8 +261,8 @@ TEST_F(extentmap_manager_test_t, force_split_balanced)
 
       if (i % 10 == 0) {
        logger().debug("submitting transaction i= {}", i);
-        tm.submit_transaction(std::move(t)).unsafe_get();
-        t = tm.create_transaction();
+        tm->submit_transaction(std::move(t)).unsafe_get();
+        t = tm->create_transaction();
       }
       if (i % 50 == 0) {
         logger().debug("check_mappings  i= {}", i);
@@ -295,7 +274,7 @@ TEST_F(extentmap_manager_test_t, force_split_balanced)
        break;
     }
     logger().debug("finally submitting transaction ");
-    tm.submit_transaction(std::move(t)).unsafe_get();
+    tm->submit_transaction(std::move(t)).unsafe_get();
     check_mappings(extmap_root);
   });
 }
index ff56aa82177567e1fa7ecba7fd9e380e0bb8a2d5..a1548cfa9deecdfc3a7f331d7169ff777774b66c 100644 (file)
@@ -4,6 +4,7 @@
 #include <random>
 
 #include "test/crimson/gtest_seastar.h"
+#include "test/crimson/seastore/transaction_manager_test_state.h"
 
 #include "crimson/os/seastore/segment_cleaner.h"
 #include "crimson/os/seastore/cache.h"
@@ -48,46 +49,18 @@ std::ostream &operator<<(std::ostream &lhs, const test_extent_record_t &rhs) {
             << ", refcount=" << rhs.refcount << ")";
 }
 
-struct transaction_manager_test_t : public seastar_test_suite_t {
-  std::unique_ptr<SegmentManager> segment_manager;
-  std::unique_ptr<SegmentCleaner> segment_cleaner;
-  std::unique_ptr<Journal> journal;
-  std::unique_ptr<Cache> cache;
-  LBAManagerRef lba_manager;
-  std::unique_ptr<TransactionManager> tm;
+struct transaction_manager_test_t :
+  public seastar_test_suite_t,
+  TMTestState {
 
   std::random_device rd;
   std::mt19937 gen;
 
   transaction_manager_test_t()
-    : segment_manager(create_ephemeral(segment_manager::DEFAULT_TEST_EPHEMERAL)),
-      gen(rd()) {
+    : gen(rd()) {
     init();
   }
 
-  void init() {
-    segment_cleaner = std::make_unique<SegmentCleaner>(
-      SegmentCleaner::config_t::default_from_segment_manager(
-       *segment_manager),
-      true);
-    journal = std::make_unique<Journal>(*segment_manager);
-    cache = std::make_unique<Cache>(*segment_manager);
-    lba_manager = lba_manager::create_lba_manager(*segment_manager, *cache);
-    tm = std::make_unique<TransactionManager>(
-      *segment_manager, *segment_cleaner, *journal, *cache, *lba_manager);
-
-    journal->set_segment_provider(&*segment_cleaner);
-    segment_cleaner->set_extent_callback(&*tm);
-  }
-
-  void destroy() {
-    tm.reset();
-    lba_manager.reset();
-    cache.reset();
-    journal.reset();
-    segment_cleaner.reset();
-  }
-
   laddr_t get_random_laddr(size_t block_size, laddr_t limit) {
     return block_size *
       std::uniform_int_distribution<>(0, (limit / block_size) - 1)(gen);
@@ -98,30 +71,11 @@ struct transaction_manager_test_t : public seastar_test_suite_t {
   }
 
   seastar::future<> set_up_fut() final {
-    return segment_manager->init().safe_then([this] {
-      return tm->mkfs();
-    }).safe_then([this] {
-      return tm->close();
-    }).safe_then([this] {
-      destroy();
-      static_cast<segment_manager::EphemeralSegmentManager*>(
-       &*segment_manager)->remount();
-      init();
-      return tm->mount();
-    }).handle_error(
-      crimson::ct_error::all_same_way([] {
-       ASSERT_FALSE("Unable to mount");
-      })
-    );
+    return tm_setup();
   }
 
   seastar::future<> tear_down_fut() final {
-    return tm->close(
-    ).handle_error(
-      crimson::ct_error::all_same_way([] {
-       ASSERT_FALSE("Unable to close");
-      })
-    );
+    return tm_teardown();
   }
 
   struct test_extents_t : std::map<laddr_t, test_extent_record_t> {
diff --git a/src/test/crimson/seastore/transaction_manager_test_state.h b/src/test/crimson/seastore/transaction_manager_test_state.h
new file mode 100644 (file)
index 0000000..053f0f9
--- /dev/null
@@ -0,0 +1,75 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+
+#pragma once
+
+#include <random>
+
+#include "crimson/os/seastore/segment_cleaner.h"
+#include "crimson/os/seastore/cache.h"
+#include "crimson/os/seastore/transaction_manager.h"
+#include "crimson/os/seastore/segment_manager/ephemeral.h"
+#include "crimson/os/seastore/segment_manager.h"
+
+using namespace crimson;
+using namespace crimson::os;
+using namespace crimson::os::seastore;
+
+class TMTestState {
+protected:
+  std::unique_ptr<segment_manager::EphemeralSegmentManager> segment_manager;
+  std::unique_ptr<SegmentCleaner> segment_cleaner;
+  std::unique_ptr<Journal> journal;
+  std::unique_ptr<Cache> cache;
+  LBAManagerRef lba_manager;
+  std::unique_ptr<TransactionManager> tm;
+
+  TMTestState()
+    : segment_manager(
+      (segment_manager::EphemeralSegmentManager*)create_ephemeral(
+       segment_manager::DEFAULT_TEST_EPHEMERAL).release()) {
+    init();
+  }
+
+  void init() {
+    segment_cleaner = std::make_unique<SegmentCleaner>(
+      SegmentCleaner::config_t::default_from_segment_manager(
+       *segment_manager),
+      true);
+    journal = std::make_unique<Journal>(*segment_manager);
+    cache = std::make_unique<Cache>(*segment_manager);
+    lba_manager = lba_manager::create_lba_manager(*segment_manager, *cache);
+    tm = std::make_unique<TransactionManager>(
+      *segment_manager, *segment_cleaner, *journal, *cache, *lba_manager);
+
+    journal->set_segment_provider(&*segment_cleaner);
+    segment_cleaner->set_extent_callback(&*tm);
+  }
+
+  void destroy() {
+    tm.reset();
+    lba_manager.reset();
+    cache.reset();
+    journal.reset();
+    segment_cleaner.reset();
+  }
+
+  seastar::future<> tm_setup() {
+    return segment_manager->init().safe_then([this] {
+      return tm->mkfs();
+    }).safe_then([this] {
+      return tm->close();
+    }).safe_then([this] {
+      destroy();
+      static_cast<segment_manager::EphemeralSegmentManager*>(
+       &*segment_manager)->remount();
+      init();
+      return tm->mount();
+    }).handle_error(crimson::ct_error::assert_all{});
+  }
+
+  seastar::future<> tm_teardown() {
+    return tm->close(
+    ).handle_error(crimson::ct_error::assert_all{});
+  }
+};