From 2ac5ba6fbfe30ca81d4c3a1ec75dc293a907c3cb Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Wed, 14 Oct 2020 00:13:40 -0700 Subject: [PATCH] test/crimson/seastore: extract common test logic for transaction_maanager initialization This should make it somewhat easier to avoid breaking tests that depend on transaction_manager. Signed-off-by: Samuel Just --- .../crimson/seastore/test_extmap_manager.cc | 107 +++++++----------- .../seastore/test_transaction_manager.cc | 60 ++-------- .../seastore/transaction_manager_test_state.h | 75 ++++++++++++ 3 files changed, 125 insertions(+), 117 deletions(-) create mode 100644 src/test/crimson/seastore/transaction_manager_test_state.h diff --git a/src/test/crimson/seastore/test_extmap_manager.cc b/src/test/crimson/seastore/test_extmap_manager.cc index bb18fe69496f4..bdee91bbe7667 100644 --- a/src/test/crimson/seastore/test_extmap_manager.cc +++ b/src/test/crimson/seastore/test_extmap_manager.cc @@ -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 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; @@ -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); }); } diff --git a/src/test/crimson/seastore/test_transaction_manager.cc b/src/test/crimson/seastore/test_transaction_manager.cc index ff56aa8217756..a1548cfa9deec 100644 --- a/src/test/crimson/seastore/test_transaction_manager.cc +++ b/src/test/crimson/seastore/test_transaction_manager.cc @@ -4,6 +4,7 @@ #include #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 segment_manager; - std::unique_ptr segment_cleaner; - std::unique_ptr journal; - std::unique_ptr cache; - LBAManagerRef lba_manager; - std::unique_ptr 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::config_t::default_from_segment_manager( - *segment_manager), - true); - journal = std::make_unique(*segment_manager); - cache = std::make_unique(*segment_manager); - lba_manager = lba_manager::create_lba_manager(*segment_manager, *cache); - tm = std::make_unique( - *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)->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 { 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 index 0000000000000..053f0f9f71dc1 --- /dev/null +++ b/src/test/crimson/seastore/transaction_manager_test_state.h @@ -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 + +#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; + std::unique_ptr segment_cleaner; + std::unique_ptr journal; + std::unique_ptr cache; + LBAManagerRef lba_manager; + std::unique_ptr tm; + + TMTestState() + : segment_manager( + (segment_manager::EphemeralSegmentManager*)create_ephemeral( + segment_manager::DEFAULT_TEST_EPHEMERAL).release()) { + init(); + } + + void init() { + segment_cleaner = std::make_unique( + SegmentCleaner::config_t::default_from_segment_manager( + *segment_manager), + true); + journal = std::make_unique(*segment_manager); + cache = std::make_unique(*segment_manager); + lba_manager = lba_manager::create_lba_manager(*segment_manager, *cache); + tm = std::make_unique( + *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)->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{}); + } +}; -- 2.39.5