From 783c5e7662006c6efca7ade795e6e731b0b18332 Mon Sep 17 00:00:00 2001 From: Zhang Song Date: Tue, 10 Jan 2023 18:01:25 +0800 Subject: [PATCH] crimson/os/seastore: support mark_space_{free, used} on cold_cleaner Signed-off-by: Zhang Song --- src/crimson/os/seastore/async_cleaner.h | 10 ++++ .../os/seastore/extent_placement_manager.h | 48 ++++++++++++++++--- 2 files changed, 52 insertions(+), 6 deletions(-) diff --git a/src/crimson/os/seastore/async_cleaner.h b/src/crimson/os/seastore/async_cleaner.h index 599db2ae032..c1787d302b3 100644 --- a/src/crimson/os/seastore/async_cleaner.h +++ b/src/crimson/os/seastore/async_cleaner.h @@ -1150,6 +1150,8 @@ public: using clean_space_ret = clean_space_ertr::future<>; virtual clean_space_ret clean_space() = 0; + virtual const std::set& get_device_ids() const = 0; + // test only virtual bool check_usage() = 0; @@ -1329,6 +1331,10 @@ public: clean_space_ret clean_space() final; + const std::set& get_device_ids() const final { + return sm_group->get_device_ids(); + } + // Testing interfaces bool check_usage() final; @@ -1643,6 +1649,10 @@ public: clean_space_ret clean_space() final; + const std::set& get_device_ids() const final { + return rb_group->get_device_ids(); + } + RandomBlockManager* get_rbm(paddr_t paddr) { auto rbs = rb_group->get_rb_managers(); for (auto p : rbs) { diff --git a/src/crimson/os/seastore/extent_placement_manager.h b/src/crimson/os/seastore/extent_placement_manager.h index ab5ffdf7495..51401e78d12 100644 --- a/src/crimson/os/seastore/extent_placement_manager.h +++ b/src/crimson/os/seastore/extent_placement_manager.h @@ -474,6 +474,14 @@ private: if (_cold_cleaner) { cold_cleaner = std::move(_cold_cleaner); cold_cleaner->set_background_callback(this); + + cleaners_by_device_id.resize(DEVICE_ID_MAX, nullptr); + for (auto id : main_cleaner->get_device_ids()) { + cleaners_by_device_id[id] = main_cleaner.get(); + } + for (auto id : cold_cleaner->get_device_ids()) { + cleaners_by_device_id[id] = cold_cleaner.get(); + } } } @@ -528,24 +536,51 @@ private: if (state < state_t::SCAN_SPACE) { return; } - assert(main_cleaner); - main_cleaner->mark_space_used(addr, len); + + if (!has_cold_tier()) { + assert(main_cleaner); + main_cleaner->mark_space_used(addr, len); + } else { + auto id = addr.get_device_id(); + assert(id < cleaners_by_device_id.size()); + auto cleaner = cleaners_by_device_id[id]; + assert(cleaner); + cleaner->mark_space_used(addr, len); + } } void mark_space_free(paddr_t addr, extent_len_t len) { if (state < state_t::SCAN_SPACE) { return; } - assert(main_cleaner); - main_cleaner->mark_space_free(addr, len); + + if (!has_cold_tier()) { + assert(main_cleaner); + main_cleaner->mark_space_free(addr, len); + } else { + auto id = addr.get_device_id(); + assert(id < cleaners_by_device_id.size()); + auto cleaner = cleaners_by_device_id[id]; + assert(cleaner); + 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(main_cleaner); - return main_cleaner->commit_space_used(addr, len); + + if (!has_cold_tier()) { + assert(main_cleaner); + main_cleaner->commit_space_used(addr, len); + } else { + auto id = addr.get_device_id(); + assert(id < cleaners_by_device_id.size()); + auto cleaner = cleaners_by_device_id[id]; + assert(cleaner); + cleaner->commit_space_used(addr, len); + } } seastar::future<> reserve_projected_usage(io_usage_t usage); @@ -664,6 +699,7 @@ private: * cold tier (optional, see has_cold_tier()) */ AsyncCleanerRef cold_cleaner; + std::vector cleaners_by_device_id; std::optional> process_join; std::optional> blocking_background; -- 2.39.5