From: Zhang Song Date: Tue, 6 Dec 2022 07:34:07 +0000 (+0800) Subject: crimson/os/seastore: reserve space before writing delayed extents X-Git-Tag: v18.1.0~699^2~4 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=79e57d11f0ab129ab9eb55a339105aefb7363bcb;p=ceph.git crimson/os/seastore: reserve space before writing delayed extents Signed-off-by: Zhang Song --- diff --git a/src/crimson/os/seastore/extent_placement_manager.cc b/src/crimson/os/seastore/extent_placement_manager.cc index 8b7e6a99f3e1..54fd44c4758d 100644 --- a/src/crimson/os/seastore/extent_placement_manager.cc +++ b/src/crimson/os/seastore/extent_placement_manager.cc @@ -421,8 +421,9 @@ ExtentPlacementManager::BackgroundProcess::run_until_halt() seastar::future<> ExtentPlacementManager::BackgroundProcess::reserve_projected_usage( - std::size_t projected_usage) + projected_usage_t usage) { + auto projected_usage = usage.inline_usage + usage.ool_usage; ceph_assert(is_ready()); ceph_assert(!blocking_io); // The pipeline configuration prevents another IO from entering diff --git a/src/crimson/os/seastore/extent_placement_manager.h b/src/crimson/os/seastore/extent_placement_manager.h index baab118d0f67..412345d8dfa8 100644 --- a/src/crimson/os/seastore/extent_placement_manager.h +++ b/src/crimson/os/seastore/extent_placement_manager.h @@ -328,12 +328,12 @@ public: return background_process.commit_space_used(addr, len); } - seastar::future<> reserve_projected_usage(std::size_t projected_usage) { - return background_process.reserve_projected_usage(projected_usage); + seastar::future<> reserve_projected_usage(projected_usage_t usage) { + return background_process.reserve_projected_usage(usage); } - void release_projected_usage(std::size_t projected_usage) { - return background_process.release_projected_usage(projected_usage); + void release_projected_usage(projected_usage_t usage) { + background_process.release_projected_usage(usage); } // Testing interfaces @@ -460,11 +460,11 @@ private: return cleaner->commit_space_used(addr, len); } - seastar::future<> reserve_projected_usage(std::size_t projected_usage); + seastar::future<> reserve_projected_usage(projected_usage_t usage); - void release_projected_usage(std::size_t projected_usage) { + void release_projected_usage(projected_usage_t usage) { ceph_assert(is_ready()); - return cleaner->release_projected_usage(projected_usage); + cleaner->release_projected_usage(usage.inline_usage + usage.ool_usage); } seastar::future<> stop_background(); diff --git a/src/crimson/os/seastore/transaction.h b/src/crimson/os/seastore/transaction.h index a9adc03e6456..11f1f6749d34 100644 --- a/src/crimson/os/seastore/transaction.h +++ b/src/crimson/os/seastore/transaction.h @@ -312,12 +312,6 @@ public: return fresh_block_stats; } - size_t get_allocation_size() const { - size_t ret = 0; - for_each_fresh_block([&ret](auto &e) { ret += e->get_length(); }); - return ret; - } - using src_t = transaction_type_t; src_t get_src() const { return src; diff --git a/src/crimson/os/seastore/transaction_manager.cc b/src/crimson/os/seastore/transaction_manager.cc index a75d8d1896a2..891a7f669bd7 100644 --- a/src/crimson/os/seastore/transaction_manager.cc +++ b/src/crimson/os/seastore/transaction_manager.cc @@ -278,12 +278,13 @@ TransactionManager::submit_transaction( return trans_intr::make_interruptible( t.get_handle().enter(write_pipeline.reserve_projected_usage) ).then_interruptible([this, FNAME, &t] { - size_t projected_usage = t.get_allocation_size(); + auto dispatch_result = epm->dispatch_delayed_extents(t); + auto projected_usage = dispatch_result.usage; SUBTRACET(seastore_t, "waiting for projected_usage: {}", t, projected_usage); return trans_intr::make_interruptible( epm->reserve_projected_usage(projected_usage) - ).then_interruptible([this, &t] { - return submit_transaction_direct(t); + ).then_interruptible([this, &t, dispatch_result = std::move(dispatch_result)] { + return do_submit_transaction(t, std::move(dispatch_result)); }).finally([this, FNAME, projected_usage, &t] { SUBTRACET(seastore_t, "releasing projected_usage: {}", t, projected_usage); epm->release_projected_usage(projected_usage); @@ -296,17 +297,30 @@ TransactionManager::submit_transaction_direct( Transaction &tref, std::optional trim_alloc_to) { - LOG_PREFIX(TransactionManager::submit_transaction_direct); + return do_submit_transaction( + tref, + epm->dispatch_delayed_extents(tref), + trim_alloc_to); +} + +TransactionManager::submit_transaction_direct_ret +TransactionManager::do_submit_transaction( + Transaction &tref, + ExtentPlacementManager::dispatch_result_t dispatch_result, + std::optional trim_alloc_to) +{ + LOG_PREFIX(TransactionManager::do_submit_transaction); SUBTRACET(seastore_t, "start", tref); return trans_intr::make_interruptible( tref.get_handle().enter(write_pipeline.ool_writes) - ).then_interruptible([this, FNAME, &tref] { - return seastar::do_with(tref.get_delayed_alloc_list(), - [this, FNAME, &tref](auto &delayed_extents) { - return epm->delayed_allocate_and_write(tref, delayed_extents - ).si_then([this, FNAME, &tref, &delayed_extents] { + ).then_interruptible([this, FNAME, &tref, + dispatch_result = std::move(dispatch_result)] { + return seastar::do_with(std::move(dispatch_result), + [this, FNAME, &tref](auto &dispatch_result) { + return epm->write_delayed_ool_extents(tref, dispatch_result.alloc_map + ).si_then([this, FNAME, &tref, &dispatch_result] { SUBTRACET(seastore_t, "update delayed extent mappings", tref); - return lba_manager->update_mappings(tref, delayed_extents); + return lba_manager->update_mappings(tref, dispatch_result.delayed_extents); }).handle_error_interruptible( crimson::ct_error::input_output_error::pass_further(), crimson::ct_error::assert_all("invalid error") diff --git a/src/crimson/os/seastore/transaction_manager.h b/src/crimson/os/seastore/transaction_manager.h index cc431ff37d6c..2514d743011d 100644 --- a/src/crimson/os/seastore/transaction_manager.h +++ b/src/crimson/os/seastore/transaction_manager.h @@ -637,6 +637,11 @@ private: Transaction& t, LogicalCachedExtentRef extent); + submit_transaction_direct_ret do_submit_transaction( + Transaction &t, + ExtentPlacementManager::dispatch_result_t dispatch_result, + std::optional seq_to_trim = std::nullopt); + public: // Testing interfaces auto get_epm() {