// 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"
}
-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>;
}
void check_mappings(extmap_root_t &extmap_root) {
- auto t = tm.create_transaction();
+ auto t = tm->create_transaction();
check_mappings(extmap_root, *t);
}
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();
}
});
}
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});
}
}
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);
}
});
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});
}
}
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) {
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);
i++;
}
logger().debug("finally submitting transaction ");
- tm.submit_transaction(std::move(t)).unsafe_get();
+ tm->submit_transaction(std::move(t)).unsafe_get();
});
}
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});
}
}
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) {
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);
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);
});
}
#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"
<< ", 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);
}
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> {
--- /dev/null
+// -*- 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{});
+ }
+};