From 9d37aad7bd9b79e6e67550c58aaf148b4e0701b5 Mon Sep 17 00:00:00 2001 From: myoungwon oh Date: Sat, 29 Oct 2022 11:20:34 +0900 Subject: [PATCH] crimson/os/seastore/cache: free rbm extent if transaction conflict occurs Signed-off-by: Myoungwon Oh --- src/crimson/os/seastore/async_cleaner.cc | 29 ++++++++++++------- src/crimson/os/seastore/async_cleaner.h | 8 +++++ src/crimson/os/seastore/cache.cc | 12 +++++++- .../os/seastore/extent_placement_manager.h | 12 ++++++++ 4 files changed, 49 insertions(+), 12 deletions(-) diff --git a/src/crimson/os/seastore/async_cleaner.cc b/src/crimson/os/seastore/async_cleaner.cc index 08c755f3ea5..10c6a9dd222 100644 --- a/src/crimson/os/seastore/async_cleaner.cc +++ b/src/crimson/os/seastore/async_cleaner.cc @@ -1561,18 +1561,12 @@ void RBMCleaner::mark_space_used( paddr_t addr, extent_len_t len) { - // Need to mark the space as used at startup time. - // We do not use mark_space_used after complete_commit() - // because alloc_extent() already reserved the space. assert(addr.get_addr_type() == paddr_types_t::RANDOM_BLOCK); - if (background_callback->get_state() == - BackgroundListener::state_t::SCAN_SPACE) { - auto rbms = rb_group->get_rb_managers(); - for (auto rbm : rbms) { - if (addr.get_device_id() == rbm->get_device_id()) { - if (rbm->get_start() <= addr) { - return rbm->mark_space_used(addr, len); - } + auto rbms = rb_group->get_rb_managers(); + for (auto rbm : rbms) { + if (addr.get_device_id() == rbm->get_device_id()) { + if (rbm->get_start() <= addr) { + rbm->mark_space_used(addr, len); } } } @@ -1593,6 +1587,19 @@ void RBMCleaner::mark_space_free( } } +void RBMCleaner::commit_space_used(paddr_t addr, extent_len_t len) +{ + auto rbms = rb_group->get_rb_managers(); + for (auto rbm : rbms) { + if (addr.get_device_id() == rbm->get_device_id()) { + if (rbm->get_start() <= addr) { + rbm->complete_allocation(addr, len); + } + return; + } + } +} + void RBMCleaner::reserve_projected_usage(std::size_t projected_usage) { assert(background_callback->is_ready()); diff --git a/src/crimson/os/seastore/async_cleaner.h b/src/crimson/os/seastore/async_cleaner.h index 493d8814672..b6cab8d6001 100644 --- a/src/crimson/os/seastore/async_cleaner.h +++ b/src/crimson/os/seastore/async_cleaner.h @@ -850,6 +850,8 @@ public: virtual void mark_space_free(paddr_t, extent_len_t) = 0; + virtual void commit_space_used(paddr_t, extent_len_t) = 0; + virtual void reserve_projected_usage(std::size_t) = 0; virtual void release_projected_usage(std::size_t) = 0; @@ -1006,6 +1008,10 @@ public: void mark_space_used(paddr_t, extent_len_t) final; void mark_space_free(paddr_t, extent_len_t) final; + + void commit_space_used(paddr_t addr, extent_len_t len) final { + mark_space_used(addr, len); + } void reserve_projected_usage(std::size_t) final; @@ -1333,6 +1339,8 @@ public: void mark_space_free(paddr_t, extent_len_t) final; + void commit_space_used(paddr_t, extent_len_t) final; + void reserve_projected_usage(std::size_t) final; void release_projected_usage(size_t) final; diff --git a/src/crimson/os/seastore/cache.cc b/src/crimson/os/seastore/cache.cc index 33c3ad35869..170e300ca7c 100644 --- a/src/crimson/os/seastore/cache.cc +++ b/src/crimson/os/seastore/cache.cc @@ -867,6 +867,10 @@ void Cache::mark_transaction_conflicted( } efforts.mutate_delta_bytes += delta_stat.bytes; + for (auto &i: t.pre_alloc_list) { + epm.mark_space_free(i->get_paddr(), i->get_length()); + } + auto& ool_stats = t.get_ool_write_stats(); efforts.fresh_ool_written.increment_stat(ool_stats.extents); efforts.num_ool_records += ool_stats.num_records; @@ -1444,7 +1448,7 @@ void Cache::complete_commit( const auto t_src = t.get_src(); i->invalidate_hints(); add_extent(i, &t_src); - epm.mark_space_used(i->get_paddr(), i->get_length()); + epm.commit_space_used(i->get_paddr(), i->get_length()); if (is_backref_mapped_extent_node(i)) { DEBUGT("backref_list new {} len {}", t, @@ -1560,6 +1564,12 @@ void Cache::complete_commit( if (!backref_list.empty()) { backref_batch_update(std::move(backref_list), start_seq); } + + for (auto &i: t.pre_alloc_list) { + if (!i->is_valid()) { + epm.mark_space_free(i->get_paddr(), i->get_length()); + } + } } void Cache::init() diff --git a/src/crimson/os/seastore/extent_placement_manager.h b/src/crimson/os/seastore/extent_placement_manager.h index 0283abfb172..d6eaa975b27 100644 --- a/src/crimson/os/seastore/extent_placement_manager.h +++ b/src/crimson/os/seastore/extent_placement_manager.h @@ -297,6 +297,10 @@ public: background_process.mark_space_free(addr, len); } + void commit_space_used(paddr_t addr, extent_len_t len) { + 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); } @@ -409,6 +413,14 @@ private: cleaner->mark_space_free(addr, len); } + void commit_space_used(paddr_t addr, extent_len_t len) { + if (state < state_t::SCAN_SPACE) { + return; + } + assert(cleaner); + return cleaner->commit_space_used(addr, len); + } + seastar::future<> reserve_projected_usage(std::size_t projected_usage); void release_projected_usage(std::size_t projected_usage) { -- 2.39.5