From 9aad0454f4ac271937caf37ae16eeb52ab4c8df4 Mon Sep 17 00:00:00 2001 From: Xuehan Xu Date: Sun, 25 Jul 2021 20:25:48 +0800 Subject: [PATCH] crimson/os/seastore: use extent placement manager to rewrite extents Signed-off-by: Xuehan Xu --- src/crimson/os/seastore/cache.cc | 7 ++++- src/crimson/os/seastore/cached_extent.h | 2 +- src/crimson/os/seastore/seastore.cc | 14 +++++++++- .../os/seastore/transaction_manager.cc | 26 ++++++++++++++----- src/crimson/os/seastore/transaction_manager.h | 5 +++- .../seastore/transaction_manager_test_state.h | 14 +++++++++- 6 files changed, 56 insertions(+), 12 deletions(-) diff --git a/src/crimson/os/seastore/cache.cc b/src/crimson/os/seastore/cache.cc index 51e50de086a79..18905214a4cc5 100644 --- a/src/crimson/os/seastore/cache.cc +++ b/src/crimson/os/seastore/cache.cc @@ -880,6 +880,9 @@ record_t Cache::prepare_record(Transaction &t) record.extents.reserve(t.fresh_block_list.size()); for (auto &i: t.fresh_block_list) { DEBUGT("fresh block {}", t, *i); + if (!i->is_inline()) { + continue; + } get_by_ext(efforts.fresh_by_ext, i->get_type()).increment(i->get_length()); bufferlist bl; @@ -912,7 +915,9 @@ void Cache::complete_commit( DEBUGT("enter", t); for (auto &i: t.fresh_block_list) { - i->set_paddr(final_block_start.add_relative(i->get_paddr())); + if (i->is_inline()) { + i->set_paddr(final_block_start.add_relative(i->get_paddr())); + } i->last_committed_crc = i->get_crc32c(); i->on_initial_write(); diff --git a/src/crimson/os/seastore/cached_extent.h b/src/crimson/os/seastore/cached_extent.h index d97e28f731241..1f1730b2b4cff 100644 --- a/src/crimson/os/seastore/cached_extent.h +++ b/src/crimson/os/seastore/cached_extent.h @@ -329,7 +329,7 @@ public: /// hint for allocators ool_placement_hint_t hint; - bool is_relative() const { + bool is_inline() const { return poffset.is_relative(); } private: diff --git a/src/crimson/os/seastore/seastore.cc b/src/crimson/os/seastore/seastore.cc index 2aa4e6c3156c4..0e6772bff7108 100644 --- a/src/crimson/os/seastore/seastore.cc +++ b/src/crimson/os/seastore/seastore.cc @@ -1184,6 +1184,17 @@ std::unique_ptr make_seastore( auto cache = std::make_unique(*sm); auto lba_manager = lba_manager::create_lba_manager(*sm, *cache); + auto epm = std::make_unique(*cache, *lba_manager); + + epm->add_allocator( + device_type_t::SEGMENTED, + std::make_unique( + *segment_cleaner, + *sm, + *lba_manager, + *journal, + *cache)); + journal->set_segment_provider(&*segment_cleaner); auto tm = std::make_unique( @@ -1191,7 +1202,8 @@ std::unique_ptr make_seastore( std::move(segment_cleaner), std::move(journal), std::move(cache), - std::move(lba_manager)); + std::move(lba_manager), + std::move(epm)); auto cm = std::make_unique(*tm); return std::make_unique( diff --git a/src/crimson/os/seastore/transaction_manager.cc b/src/crimson/os/seastore/transaction_manager.cc index 52c9ffb3e3261..56ce3533bc60c 100644 --- a/src/crimson/os/seastore/transaction_manager.cc +++ b/src/crimson/os/seastore/transaction_manager.cc @@ -16,12 +16,14 @@ TransactionManager::TransactionManager( SegmentCleanerRef _segment_cleaner, JournalRef _journal, CacheRef _cache, - LBAManagerRef _lba_manager) + LBAManagerRef _lba_manager, + ExtentPlacementManagerRef&& epm) : segment_manager(_segment_manager), segment_cleaner(std::move(_segment_cleaner)), cache(std::move(_cache)), lba_manager(std::move(_lba_manager)), - journal(std::move(_journal)) + journal(std::move(_journal)), + epm(std::move(epm)) { segment_cleaner->set_extent_callback(this); journal->set_write_pipeline(&write_pipeline); @@ -232,10 +234,15 @@ TransactionManager::submit_transaction_direct( { LOG_PREFIX(TransactionManager::submit_transaction_direct); DEBUGT("about to prepare", tref); - return trans_intr::make_interruptible( - tref.get_handle().enter(write_pipeline.prepare) - ).then_interruptible([this, FNAME, &tref]() mutable - -> submit_transaction_iertr::future<> { + + return epm->delayed_alloc_or_ool_write(tref) + .handle_error_interruptible( + crimson::ct_error::input_output_error::pass_further(), + crimson::ct_error::assert_all("invalid error") + ).si_then([&tref, this] { + return tref.get_handle().enter(write_pipeline.prepare); + }).si_then([this, FNAME, &tref]() mutable + -> submit_transaction_iertr::future<> { auto record = cache->prepare_record(tref); tref.get_handle().maybe_release_collection_lock(); @@ -295,7 +302,7 @@ TransactionManager::rewrite_logical_extent( auto lextent = extent->cast(); cache->retire_extent(t, extent); - auto nlextent = cache->alloc_new_extent_by_type( + auto nlextent = epm->alloc_new_extent_by_type( t, lextent->get_type(), lextent->get_length())->cast(); @@ -312,6 +319,11 @@ TransactionManager::rewrite_logical_extent( *lextent, *nlextent); + if (need_delayed_allocation(extent->backend_type)) { + // hold old poffset for later mapping updating assert check + nlextent->set_paddr(lextent->get_paddr()); + return rewrite_extent_iertr::now(); + } return lba_manager->update_mapping( t, lextent->get_laddr(), diff --git a/src/crimson/os/seastore/transaction_manager.h b/src/crimson/os/seastore/transaction_manager.h index 9a692109c5fc8..695484d45f9a1 100644 --- a/src/crimson/os/seastore/transaction_manager.h +++ b/src/crimson/os/seastore/transaction_manager.h @@ -27,6 +27,7 @@ #include "crimson/os/seastore/segment_manager.h" #include "crimson/os/seastore/lba_manager.h" #include "crimson/os/seastore/journal.h" +#include "crimson/os/seastore/extent_placement_manager.h" namespace crimson::os::seastore { class Journal; @@ -69,7 +70,8 @@ public: SegmentCleanerRef segment_cleaner, JournalRef journal, CacheRef cache, - LBAManagerRef lba_manager); + LBAManagerRef lba_manager, + ExtentPlacementManagerRef&& epm); /// Writes initial metadata to disk using mkfs_ertr = base_ertr; @@ -497,6 +499,7 @@ private: CacheRef cache; LBAManagerRef lba_manager; JournalRef journal; + ExtentPlacementManagerRef epm; WritePipeline write_pipeline; diff --git a/src/test/crimson/seastore/transaction_manager_test_state.h b/src/test/crimson/seastore/transaction_manager_test_state.h index 4d9eab791820c..04c7a11c87e55 100644 --- a/src/test/crimson/seastore/transaction_manager_test_state.h +++ b/src/test/crimson/seastore/transaction_manager_test_state.h @@ -80,6 +80,17 @@ auto get_transaction_manager( auto cache = std::make_unique(segment_manager); auto lba_manager = lba_manager::create_lba_manager(segment_manager, *cache); + auto epm = std::make_unique(*cache, *lba_manager); + + epm->add_allocator( + device_type_t::SEGMENTED, + std::make_unique( + *segment_cleaner, + segment_manager, + *lba_manager, + *journal, + *cache)); + journal->set_segment_provider(&*segment_cleaner); return std::make_unique( @@ -87,7 +98,8 @@ auto get_transaction_manager( std::move(segment_cleaner), std::move(journal), std::move(cache), - std::move(lba_manager)); + std::move(lba_manager), + std::move(epm)); } auto get_seastore(SegmentManagerRef sm) { -- 2.39.5