From: Samuel Just Date: Thu, 18 Mar 2021 22:20:36 +0000 (-0700) Subject: crimson/os/seastore: track uncached released extents X-Git-Tag: v17.1.0~2478^2~16 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=ce941bfcc153e9464363297cb08c4f9234d74964;p=ceph.git crimson/os/seastore: track uncached released extents We need to properly release the space after commit. Signed-off-by: Samuel Just --- diff --git a/src/crimson/os/seastore/cache.cc b/src/crimson/os/seastore/cache.cc index e976d9bb660..619971bf2bb 100644 --- a/src/crimson/os/seastore/cache.cc +++ b/src/crimson/os/seastore/cache.cc @@ -33,7 +33,7 @@ Cache::~Cache() } Cache::retire_extent_ret Cache::retire_extent_if_cached( - Transaction &t, paddr_t addr) + Transaction &t, paddr_t addr, extent_len_t length) { if (auto ext = t.write_set.find_offset(addr); ext != t.write_set.end()) { logger().debug("{}: found {} in t.write_set", __func__, addr); @@ -47,6 +47,7 @@ Cache::retire_extent_ret Cache::retire_extent_if_cached( return retire_extent_ertr::now(); }); } else { + t.add_to_retired_uncached(addr, length); return retire_extent_ertr::now(); } } @@ -332,6 +333,11 @@ void Cache::complete_commit( i->get_paddr(), i->get_length()); } + for (auto &i: t.retired_uncached) { + cleaner->mark_space_free( + i.first, + i.second); + } } for (auto &i: t.mutated_block_list) { diff --git a/src/crimson/os/seastore/cache.h b/src/crimson/os/seastore/cache.h index 08b71f315cc..3bf112840ff 100644 --- a/src/crimson/os/seastore/cache.h +++ b/src/crimson/os/seastore/cache.h @@ -110,7 +110,7 @@ public: using retire_extent_ertr = base_ertr; using retire_extent_ret = retire_extent_ertr::future<>; retire_extent_ret retire_extent_if_cached( - Transaction &t, paddr_t addr); + Transaction &t, paddr_t addr, extent_len_t length); /** * get_root diff --git a/src/crimson/os/seastore/lba_manager.h b/src/crimson/os/seastore/lba_manager.h index 2622a76ff74..26646ff0546 100644 --- a/src/crimson/os/seastore/lba_manager.h +++ b/src/crimson/os/seastore/lba_manager.h @@ -90,6 +90,7 @@ public: struct ref_update_result_t { unsigned refcount = 0; paddr_t addr; + extent_len_t length = 0; }; using ref_ertr = base_ertr::extend< crimson::ct_error::enoent>; diff --git a/src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.cc b/src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.cc index a0540b38666..b227e8e6e3a 100644 --- a/src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.cc +++ b/src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.cc @@ -522,7 +522,11 @@ BtreeLBAManager::update_refcount_ret BtreeLBAManager::update_refcount( out.refcount += delta; return out; }).safe_then([](auto result) { - return ref_update_result_t{result.refcount, result.paddr}; + return ref_update_result_t{ + result.refcount, + result.paddr, + result.len + }; }); } diff --git a/src/crimson/os/seastore/transaction.h b/src/crimson/os/seastore/transaction.h index a2ad59825cc..e487fa6d42a 100644 --- a/src/crimson/os/seastore/transaction.h +++ b/src/crimson/os/seastore/transaction.h @@ -61,6 +61,10 @@ public: } } + void add_to_retired_uncached(paddr_t addr, extent_len_t length) { + retired_uncached.emplace_back(std::make_pair(addr, length)); + } + void add_to_read_set(CachedExtentRef ref) { if (is_weak()) return; @@ -133,6 +137,8 @@ private: ///< if != NULL_SEG_ID, release this segment after completion segment_id_t to_release = NULL_SEG_ID; + std::vector> retired_uncached; + public: Transaction( OrderingHandle &&handle, diff --git a/src/crimson/os/seastore/transaction_manager.cc b/src/crimson/os/seastore/transaction_manager.cc index d1b97d913c1..3e530869349 100644 --- a/src/crimson/os/seastore/transaction_manager.cc +++ b/src/crimson/os/seastore/transaction_manager.cc @@ -160,7 +160,9 @@ TransactionManager::ref_ret TransactionManager::dec_ref( logger().debug( "TransactionManager::dec_ref: offset {} refcount 0", offset); - return cache->retire_extent_if_cached(t, result.addr).safe_then([] { + return cache->retire_extent_if_cached( + t, result.addr, result.length + ).safe_then([] { return ref_ret( ref_ertr::ready_future_marker{}, 0);