From 3a135c04c73751c971d6914120c7e788e4291d3f Mon Sep 17 00:00:00 2001 From: myoungwon oh Date: Mon, 5 Dec 2022 11:33:10 +0900 Subject: [PATCH] test/crimson/seastore: enable RBM-based unittest-seastore Signed-off-by: Myoungwon Oh --- src/crimson/os/seastore/seastore.cc | 113 +++++++++------ src/crimson/os/seastore/seastore.h | 8 ++ src/test/crimson/seastore/test_seastore.cc | 52 ++++--- .../seastore/transaction_manager_test_state.h | 133 +++--------------- 4 files changed, 135 insertions(+), 171 deletions(-) diff --git a/src/crimson/os/seastore/seastore.cc b/src/crimson/os/seastore/seastore.cc index 27c1cc51549..0069d571455 100644 --- a/src/crimson/os/seastore/seastore.cc +++ b/src/crimson/os/seastore/seastore.cc @@ -168,6 +168,17 @@ seastar::future<> SeaStore::stop() return seastar::now(); } +SeaStore::mount_ertr::future<> SeaStore::test_mount() +{ + init_managers(); + return transaction_manager->mount( + ).handle_error( + crimson::ct_error::assert_all{ + "Invalid error in SeaStore::test_mount" + } + ); +} + SeaStore::mount_ertr::future<> SeaStore::mount() { return device->mount( @@ -246,6 +257,66 @@ seastar::future<> SeaStore::write_fsid(uuid_d new_osd_fsid) }); } +seastar::future<> SeaStore::_mkfs(uuid_d new_osd_fsid) +{ + init_managers(); + return transaction_manager->mkfs( + ).safe_then([this] { + init_managers(); + return transaction_manager->mount(); + }).safe_then([this] { + return repeat_eagain([this] { + return transaction_manager->with_transaction_intr( + Transaction::src_t::MUTATE, + "mkfs_seastore", + [this](auto& t) + { + return onode_manager->mkfs(t + ).si_then([this, &t] { + return collection_manager->mkfs(t); + }).si_then([this, &t](auto coll_root) { + transaction_manager->write_collection_root( + t, coll_root); + return transaction_manager->submit_transaction(t); + }); + }); + }); + }).safe_then([this, new_osd_fsid] { + return write_fsid(new_osd_fsid); + }).safe_then([this] { + return read_meta("type").then([this] (auto tuple) { + auto [ret, type] = tuple; + if (ret == 0 && type == "seastore") { + return seastar::now(); + } else if (ret == 0 && type != "seastore") { + LOG_PREFIX(SeaStore::mkfs); + ERROR("expected seastore, but type is {}", type); + throw std::runtime_error("store type error"); + } else { + return write_meta("type", "seastore"); + } + }); + }).safe_then([this] { + return write_meta("mkfs_done", "yes"); + }).handle_error( + crimson::ct_error::assert_all{ + "Invalid error in SeaStore::_mkfs" + } + ); +} + +SeaStore::mkfs_ertr::future<> SeaStore::test_mkfs(uuid_d new_osd_fsid) +{ + + return read_meta("mkfs_done").then([this, new_osd_fsid] (auto tuple) { + auto [done, value] = tuple; + if (done == 0) { + return seastar::now(); + } + return _mkfs(new_osd_fsid); + }); +} + SeaStore::mkfs_ertr::future<> SeaStore::mkfs(uuid_d new_osd_fsid) { return read_meta("mkfs_done").then([this, new_osd_fsid] (auto tuple) { @@ -327,48 +398,10 @@ SeaStore::mkfs_ertr::future<> SeaStore::mkfs(uuid_d new_osd_fsid) }); }).safe_then([this] { return device->mount(); - }).safe_then([this] { - init_managers(); - return transaction_manager->mkfs(); - }).safe_then([this] { - init_managers(); - return transaction_manager->mount(); - }).safe_then([this] { - return repeat_eagain([this] { - return transaction_manager->with_transaction_intr( - Transaction::src_t::MUTATE, - "mkfs_seastore", - [this](auto& t) - { - return onode_manager->mkfs(t - ).si_then([this, &t] { - return collection_manager->mkfs(t); - }).si_then([this, &t](auto coll_root) { - transaction_manager->write_collection_root( - t, coll_root); - return transaction_manager->submit_transaction(t); - }); - }); - }); }).safe_then([this, new_osd_fsid] { - return write_fsid(new_osd_fsid); - }).safe_then([this] { - return read_meta("type").then([this] (auto tuple) { - auto [ret, type] = tuple; - if (ret == 0 && type == "seastore") { - return seastar::now(); - } else if (ret == 0 && type != "seastore") { - LOG_PREFIX(SeaStore::mkfs); - ERROR("expected seastore, but type is {}", type); - throw std::runtime_error("store type error"); - } else { - return write_meta("type", "seastore"); - } - }); - }).safe_then([this] { - return write_meta("mkfs_done", "yes"); + return _mkfs(new_osd_fsid); }).safe_then([this] { - return umount(); + return umount(); }).handle_error( crimson::ct_error::assert_all{ "Invalid error in SeaStore::mkfs" diff --git a/src/crimson/os/seastore/seastore.h b/src/crimson/os/seastore/seastore.h index 9b8833e73a5..80ad7442590 100644 --- a/src/crimson/os/seastore/seastore.h +++ b/src/crimson/os/seastore/seastore.h @@ -181,6 +181,13 @@ public: MAX }; + // for test + mount_ertr::future<> test_mount(); + mkfs_ertr::future<> test_mkfs(uuid_d new_osd_fsid); + DeviceRef get_primary_device_ref() { + return std::move(device); + } + private: struct internal_context_t { CollectionRef ch; @@ -435,6 +442,7 @@ private: seastar::metrics::metric_group metrics; void register_metrics(); seastar::future<> write_fsid(uuid_d new_osd_fsid); + seastar::future<> _mkfs(uuid_d new_osd_fsid); }; seastar::future> make_seastore( diff --git a/src/test/crimson/seastore/test_seastore.cc b/src/test/crimson/seastore/test_seastore.cc index a2e450de4ae..3a507f4b0f5 100644 --- a/src/test/crimson/seastore/test_seastore.cc +++ b/src/test/crimson/seastore/test_seastore.cc @@ -55,7 +55,8 @@ ghobject_t make_temp_oid(int i) { struct seastore_test_t : public seastar_test_suite_t, - SeaStoreTestState { + SeaStoreTestState, + ::testing::WithParamInterface { coll_t coll_name{spg_t{pg_t{0, 0}}}; CollectionRef coll; @@ -63,7 +64,16 @@ struct seastore_test_t : seastore_test_t() {} seastar::future<> set_up_fut() final { - return tm_setup( + std::string j_type = GetParam(); + journal_type_t journal; + if (j_type == "segmented") { + journal = journal_type_t::SEGMENTED; + } else if (j_type == "circularbounded") { + journal = journal_type_t::RANDOM_BLOCK; + } else { + ceph_assert(0 == "no support"); + } + return tm_setup(journal ).then([this] { return seastore->create_new_collection(coll_name); }).then([this](auto coll_ref) { @@ -594,7 +604,7 @@ auto contains(const T &t, const V &v) { v) != t.end(); } -TEST_F(seastore_test_t, collection_create_list_remove) +TEST_P(seastore_test_t, collection_create_list_remove) { run_async([this] { coll_t test_coll{spg_t{pg_t{1, 0}}}; @@ -624,7 +634,7 @@ TEST_F(seastore_test_t, collection_create_list_remove) }); } -TEST_F(seastore_test_t, meta) { +TEST_P(seastore_test_t, meta) { run_async([this] { set_meta("key1", "value1"); set_meta("key2", "value2"); @@ -638,7 +648,7 @@ TEST_F(seastore_test_t, meta) { }); } -TEST_F(seastore_test_t, touch_stat_list_remove) +TEST_P(seastore_test_t, touch_stat_list_remove) { run_async([this] { auto &test_obj = get_object(make_oid(0)); @@ -677,12 +687,12 @@ static const seastore_test_t::list_test_cases_t temp_list_cases{ { 0, bound_t::get_temp_end(), bound_t::get_max() }, }; -TEST_F(seastore_test_t, list_objects_temp_only) +TEST_P(seastore_test_t, list_objects_temp_only) { run_async([this] { test_list(5, 0, temp_list_cases); }); } -TEST_F(seastore_test_t, list_objects_temp_overlap) +TEST_P(seastore_test_t, list_objects_temp_overlap) { run_async([this] { test_list(5, 5, temp_list_cases); }); } @@ -713,12 +723,12 @@ static const seastore_test_t::list_test_cases_t normal_list_cases{ { 0, bound_t::get_normal_begin(), bound_t::get_max() }, }; -TEST_F(seastore_test_t, list_objects_normal_only) +TEST_P(seastore_test_t, list_objects_normal_only) { run_async([this] { test_list(5, 0, normal_list_cases); }); } -TEST_F(seastore_test_t, list_objects_normal_overlap) +TEST_P(seastore_test_t, list_objects_normal_overlap) { run_async([this] { test_list(5, 5, normal_list_cases); }); } @@ -730,7 +740,7 @@ bufferlist make_bufferlist(size_t len) { return bl; } -TEST_F(seastore_test_t, omap_test_simple) +TEST_P(seastore_test_t, omap_test_simple) { run_async([this] { auto &test_obj = get_object(make_oid(0)); @@ -745,7 +755,7 @@ TEST_F(seastore_test_t, omap_test_simple) }); } -TEST_F(seastore_test_t, attr) +TEST_P(seastore_test_t, attr) { run_async([this] { auto& test_obj = get_object(make_oid(0)); @@ -887,7 +897,7 @@ TEST_F(seastore_test_t, attr) }); } -TEST_F(seastore_test_t, omap_test_iterator) +TEST_P(seastore_test_t, omap_test_iterator) { run_async([this] { auto make_key = [](unsigned i) { @@ -908,7 +918,7 @@ TEST_F(seastore_test_t, omap_test_iterator) } -TEST_F(seastore_test_t, simple_extent_test) +TEST_P(seastore_test_t, simple_extent_test) { run_async([this] { auto &test_obj = get_object(make_oid(0)); @@ -925,7 +935,7 @@ TEST_F(seastore_test_t, simple_extent_test) }); } -TEST_F(seastore_test_t, fiemap_empty) +TEST_P(seastore_test_t, fiemap_empty) { run_async([this] { auto &test_obj = get_object(make_oid(0)); @@ -940,7 +950,7 @@ TEST_F(seastore_test_t, fiemap_empty) }); } -TEST_F(seastore_test_t, fiemap_holes) +TEST_P(seastore_test_t, fiemap_holes) { run_async([this] { const uint64_t MAX_EXTENTS = 100; @@ -990,7 +1000,7 @@ TEST_F(seastore_test_t, fiemap_holes) }); } -TEST_F(seastore_test_t, sparse_read) +TEST_P(seastore_test_t, sparse_read) { run_async([this] { const uint64_t MAX_EXTENTS = 100; @@ -1020,7 +1030,7 @@ TEST_F(seastore_test_t, sparse_read) }); } -TEST_F(seastore_test_t, zero) +TEST_P(seastore_test_t, zero) { run_async([this] { auto test_zero = [this]( @@ -1077,3 +1087,11 @@ TEST_F(seastore_test_t, zero) (BS * 4) + 128); }); } +INSTANTIATE_TEST_SUITE_P( + seastore_test, + seastore_test_t, + ::testing::Values ( + "segmented", + "circularbounded" + ) +); diff --git a/src/test/crimson/seastore/transaction_manager_test_state.h b/src/test/crimson/seastore/transaction_manager_test_state.h index f6f36205d1f..8280e4b7560 100644 --- a/src/test/crimson/seastore/transaction_manager_test_state.h +++ b/src/test/crimson/seastore/transaction_manager_test_state.h @@ -33,6 +33,7 @@ public: virtual ~EphemeralDevices() {} virtual Device* get_primary_device() = 0; virtual DeviceRef get_primary_device_ref() = 0; + virtual void set_primary_device_ref(DeviceRef) = 0; }; using EphemeralDevicesRef = std::unique_ptr; @@ -110,6 +111,7 @@ public: return segment_manager.get(); } DeviceRef get_primary_device_ref() final; + void set_primary_device_ref(DeviceRef) final; }; class EphemeralRandomBlockDevices : public EphemeralDevices { @@ -158,6 +160,7 @@ public: return rb_device.get(); } DeviceRef get_primary_device_ref() final; + void set_primary_device_ref(DeviceRef) final; }; class EphemeralTestState { @@ -333,124 +336,25 @@ protected: } }; -class TestSegmentManagerWrapper final : public SegmentManager { - SegmentManager &sm; - device_id_t device_id = 0; - secondary_device_set_t set; -public: - TestSegmentManagerWrapper( - SegmentManager &sm, - device_id_t device_id = 0) - : sm(sm), device_id(device_id) {} - - device_id_t get_device_id() const { - return device_id; - } - - mount_ret mount() final { - return mount_ertr::now(); // we handle this above - } - - mkfs_ret mkfs(device_config_t c) final { - return mkfs_ertr::now(); // we handle this above - } - - close_ertr::future<> close() final { - return sm.close(); - } - - secondary_device_set_t& get_secondary_devices() final { - return sm.get_secondary_devices(); - } - - magic_t get_magic() const final { - return sm.get_magic(); - } - - open_ertr::future open(segment_id_t id) final { - return sm.open(id); - } - - release_ertr::future<> release(segment_id_t id) final { - return sm.release(id); - } - - read_ertr::future<> read( - paddr_t addr, size_t len, ceph::bufferptr &out) final { - return sm.read(addr, len, out); - } - - size_t get_available_size() const final { return sm.get_available_size(); } - extent_len_t get_block_size() const final { return sm.get_block_size(); } - segment_off_t get_segment_size() const final { - return sm.get_segment_size(); - } - const seastore_meta_t &get_meta() const final { - return sm.get_meta(); - } - ~TestSegmentManagerWrapper() final {} -}; DeviceRef EphemeralSegmentedDevices::get_primary_device_ref() { - return std::make_unique(*segment_manager); + return std::move(segment_manager); } -class TestRandomBlockDeviceWrapper final : public Device { - RBMDevice &rb_device; - device_id_t device_id = 0; - secondary_device_set_t set; -public: - TestRandomBlockDeviceWrapper( - RBMDevice &rb_device, - device_id_t device_id = 0) - : rb_device(rb_device), device_id(device_id) {} - - device_id_t get_device_id() const { - return device_id; - } - - mount_ret mount() final { - return mount_ertr::now(); // we handle this above - } - - mkfs_ret mkfs(device_config_t c) final { - return mkfs_ertr::now(); // we handle this above - } - - close_ertr::future<> close() final { - return rb_device.close(); - } - - secondary_device_set_t& get_secondary_devices() final { - return rb_device.get_secondary_devices(); - } - - magic_t get_magic() const final { - return rb_device.get_magic(); - } - read_ertr::future<> read( - paddr_t addr, size_t len, ceph::bufferptr &out) final { - return rb_device.read(addr, len, out); - } - - size_t get_available_size() const final { return rb_device.get_available_size(); } - extent_len_t get_block_size() const final { return rb_device.get_block_size(); } - const seastore_meta_t &get_meta() const final { - return rb_device.get_meta(); - } - device_type_t get_device_type() const final { - return device_type_t::RANDOM_BLOCK_SSD; - } - - backend_type_t get_backend_type() const final { - return backend_type_t::RANDOM_BLOCK; - } +DeviceRef EphemeralRandomBlockDevices::get_primary_device_ref() { + return std::move(rb_device); +} - ~TestRandomBlockDeviceWrapper() final {} -}; +void EphemeralSegmentedDevices::set_primary_device_ref(DeviceRef dev) { + segment_manager = + segment_manager::EphemeralSegmentManagerRef( + static_cast(dev.release())); +} -DeviceRef EphemeralRandomBlockDevices::get_primary_device_ref() { - return std::make_unique(*rb_device); +void EphemeralRandomBlockDevices::set_primary_device_ref(DeviceRef dev) { + rb_device = + random_block_device::RBMDeviceRef( + static_cast(dev.release())); } class SeaStoreTestState : public EphemeralTestState { @@ -498,6 +402,7 @@ protected: } virtual void _destroy() final { + devices->set_primary_device_ref(seastore->get_primary_device_ref()); seastore.reset(); } @@ -506,10 +411,10 @@ protected: } virtual FuturizedStore::mount_ertr::future<> _mount() final { - return seastore->mount(); + return seastore->test_mount(); } virtual FuturizedStore::mkfs_ertr::future<> _mkfs() final { - return seastore->mkfs(uuid_d{}); + return seastore->test_mkfs(uuid_d{}); } }; -- 2.39.5