From 62f3cf1a3d1dff4fea0e1dfd5fe4473ef08e9d1c Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Fri, 10 Dec 2021 14:31:00 -0800 Subject: [PATCH] crimson/os/seastore/cache: init extents prior to read Thus should ensure that any captured members of extent_init_func are still valid at the cost of not being able to access the contents of the extent at invocation time. With this, we should be able to rely on any logical extents/lba extents in the cache having validly initialized lba pins. Fixes: https://tracker.ceph.com/issues/53555 Signed-off-by: Samuel Just --- src/crimson/os/seastore/cache.h | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/crimson/os/seastore/cache.h b/src/crimson/os/seastore/cache.h index 2bda709995f2c..08f2b6b350ccf 100644 --- a/src/crimson/os/seastore/cache.h +++ b/src/crimson/os/seastore/cache.h @@ -192,8 +192,9 @@ public: ret->set_paddr(offset); ret->state = CachedExtent::extent_state_t::CLEAN_PENDING; add_extent(ret); + extent_init_func(*ret); return read_extent( - std::move(ret), std::forward(extent_init_func)); + std::move(ret)); } // extent PRESENT in cache @@ -211,8 +212,9 @@ public: } cached->state = CachedExtent::extent_state_t::INVALID; + extent_init_func(*ret); return read_extent( - std::move(ret), std::forward(extent_init_func)); + std::move(ret)); } else { auto ret = TCachedExtentRef(static_cast(cached.get())); return ret->wait_io( @@ -879,10 +881,9 @@ private: /// Introspect transaction when it is being destructed void on_transaction_destruct(Transaction& t); - template + template get_extent_ret read_extent( - TCachedExtentRef&& extent, - Func &&func + TCachedExtentRef&& extent ) { assert(extent->state == CachedExtent::extent_state_t::CLEAN_PENDING); extent->set_io_wait(); @@ -891,13 +892,12 @@ private: extent->get_length(), extent->get_bptr() ).safe_then( - [extent=std::move(extent), func=std::forward(func)]() mutable { + [extent=std::move(extent)]() mutable { extent->state = CachedExtent::extent_state_t::CLEAN; /* TODO: crc should be checked against LBA manager */ extent->last_committed_crc = extent->get_crc32c(); extent->on_clean_read(); - func(*extent); extent->complete_io(); return get_extent_ertr::make_ready_future>( std::move(extent)); -- 2.39.5