From e79ad1a5aaaf43b8a0dc338b0f0fba0a01eb22cc Mon Sep 17 00:00:00 2001 From: Xuehan Xu Date: Tue, 15 Mar 2022 11:40:52 +0800 Subject: [PATCH] crimson/os/seastore/transaction_manager: scan backref tree on mount Signed-off-by: Xuehan Xu --- src/crimson/os/seastore/cache.h | 3 ++ src/crimson/os/seastore/segment_cleaner.h | 5 ++- .../os/seastore/transaction_manager.cc | 38 ++++++++++++++++++- src/crimson/os/seastore/transaction_manager.h | 8 ++++ .../seastore/test_transaction_manager.cc | 24 +++++++++++- .../seastore/transaction_manager_test_state.h | 4 ++ 6 files changed, 77 insertions(+), 5 deletions(-) diff --git a/src/crimson/os/seastore/cache.h b/src/crimson/os/seastore/cache.h index 0748ab5cf71..aa30c061d64 100644 --- a/src/crimson/os/seastore/cache.h +++ b/src/crimson/os/seastore/cache.h @@ -916,6 +916,9 @@ public: /// Dump live extents void dump_contents(); + void force_roll_backref_buffer() { + may_roll_backref_buffer(P_ADDR_NULL, true); + } void may_roll_backref_buffer( const paddr_t &final_block_start, bool force_roll = false) { diff --git a/src/crimson/os/seastore/segment_cleaner.h b/src/crimson/os/seastore/segment_cleaner.h index 133b1d66e94..b189af533b2 100644 --- a/src/crimson/os/seastore/segment_cleaner.h +++ b/src/crimson/os/seastore/segment_cleaner.h @@ -690,8 +690,9 @@ public: void mark_space_free( paddr_t addr, - extent_len_t len) { - if (!init_complete) + extent_len_t len, + const bool force = false) { + if (!init_complete && !force) return; ceph_assert(stats.used_bytes >= len); diff --git a/src/crimson/os/seastore/transaction_manager.cc b/src/crimson/os/seastore/transaction_manager.cc index 6977c716d50..1588d0a96a7 100644 --- a/src/crimson/os/seastore/transaction_manager.cc +++ b/src/crimson/os/seastore/transaction_manager.cc @@ -111,11 +111,14 @@ TransactionManager::mount_ertr::future<> TransactionManager::mount() *tref, [this, FNAME](auto &t) { return cache->init_cached_extents(t, [this](auto &t, auto &e) { - return lba_manager->init_cached_extent(t, e); + if (is_backref_node(e->get_type())) + return backref_manager->init_cached_extent(t, e); + else + return lba_manager->init_cached_extent(t, e); }).si_then([this, FNAME, &t] { assert(segment_cleaner->debug_check_space( *segment_cleaner->get_empty_space_tracker())); - return lba_manager->scan_mapped_space( + return backref_manager->scan_mapped_space( t, [this, FNAME, &t](paddr_t addr, extent_len_t len, depth_t depth) { TRACET( @@ -131,11 +134,42 @@ TransactionManager::mount_ertr::future<> TransactionManager::mount() seastar::lowres_system_clock::time_point(), /* init_scan = */ true); } + if (depth) { + if (depth > 1) { + cache->add_backref_extent( + addr, extent_types_t::BACKREF_INTERNAL); + } else { + cache->add_backref_extent( + addr, extent_types_t::BACKREF_LEAF); + } + } + }).si_then([this] { + LOG_PREFIX(TransactionManager::mount); + auto &backrefs = cache->get_backrefs(); + DEBUG("marking {} backrefs used", backrefs.size()); + for (auto &backref : backrefs) { + segment_cleaner->mark_space_used( + backref.paddr, + backref.len, + seastar::lowres_system_clock::time_point(), + seastar::lowres_system_clock::time_point(), + true); + } + auto &del_backrefs = cache->get_del_backrefs(); + DEBUG("marking {} backrefs free", del_backrefs.size()); + for (auto &del_backref : del_backrefs) { + segment_cleaner->mark_space_free( + del_backref.paddr, + del_backref.len, + true); + } + return seastar::now(); }); }); }); }); }).safe_then([this] { + cache->force_roll_backref_buffer(); return epm->open(); }).safe_then([FNAME, this] { segment_cleaner->complete_init(); diff --git a/src/crimson/os/seastore/transaction_manager.h b/src/crimson/os/seastore/transaction_manager.h index fd7c743e26f..b4e9ed92af4 100644 --- a/src/crimson/os/seastore/transaction_manager.h +++ b/src/crimson/os/seastore/transaction_manager.h @@ -574,6 +574,14 @@ public: auto get_lba_manager() { return lba_manager.get(); } + + auto get_backref_manager() { + return backref_manager.get(); + } + + auto get_cache() { + return cache.get(); + } }; using TransactionManagerRef = std::unique_ptr; diff --git a/src/test/crimson/seastore/test_transaction_manager.cc b/src/test/crimson/seastore/test_transaction_manager.cc index ad3de7dc397..cfdfef9a6d2 100644 --- a/src/test/crimson/seastore/test_transaction_manager.cc +++ b/src/test/crimson/seastore/test_transaction_manager.cc @@ -388,13 +388,35 @@ struct transaction_manager_test_t : with_trans_intr( *t.t, [this, &tracker](auto &t) { - return lba_manager->scan_mapped_space( + return backref_manager->scan_mapped_space( t, [&tracker](auto offset, auto len, depth_t) { + logger().debug("check_usage: tracker alloc {}~{}", + offset, len); tracker->allocate( offset.as_seg_paddr().get_segment_id(), offset.as_seg_paddr().get_segment_off(), len); + }).si_then([&tracker, this] { + auto &backrefs = cache->get_backrefs(); + for (auto &backref : backrefs) { + logger().debug("check_usage: by backref, tracker alloc {}~{}", + backref.paddr, backref.len); + tracker->allocate( + backref.paddr.as_seg_paddr().get_segment_id(), + backref.paddr.as_seg_paddr().get_segment_off(), + backref.len); + } + auto &del_backrefs = cache->get_del_backrefs(); + for (auto &del_backref : del_backrefs) { + logger().debug("check_usage: by backref, tracker release {}~{}", + del_backref.paddr, del_backref.len); + tracker->release( + del_backref.paddr.as_seg_paddr().get_segment_id(), + del_backref.paddr.as_seg_paddr().get_segment_off(), + del_backref.len); + } + return seastar::now(); }); }).unsafe_get0(); return segment_cleaner->debug_check_space(*tracker); diff --git a/src/test/crimson/seastore/transaction_manager_test_state.h b/src/test/crimson/seastore/transaction_manager_test_state.h index 93fc5af92eb..92cf2115ac4 100644 --- a/src/test/crimson/seastore/transaction_manager_test_state.h +++ b/src/test/crimson/seastore/transaction_manager_test_state.h @@ -130,6 +130,8 @@ class TMTestState : public EphemeralTestState { protected: TransactionManagerRef tm; LBAManager *lba_manager; + BackrefManager *backref_manager; + Cache* cache; SegmentCleaner *segment_cleaner; TMTestState() : EphemeralTestState(1) {} @@ -146,6 +148,8 @@ protected: } segment_cleaner = tm->get_segment_cleaner(); lba_manager = tm->get_lba_manager(); + backref_manager = tm->get_backref_manager(); + cache = tm->get_cache(); } virtual void _destroy() override { -- 2.39.5