From: Xuehan Xu Date: Mon, 7 Apr 2025 08:42:18 +0000 (+0800) Subject: crimson/os/seastore/transaction_manager: allow users of X-Git-Tag: v20.3.0~79^2~5 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=84f0d50797fac5bcc5e6c912bb70eae207e684db;p=ceph.git crimson/os/seastore/transaction_manager: allow users of TransactionManager to pass an initializer when loading logical extents from disks Signed-off-by: Xuehan Xu --- diff --git a/src/crimson/os/seastore/transaction_manager.h b/src/crimson/os/seastore/transaction_manager.h index 62880df08383b..bc553e955b275 100644 --- a/src/crimson/os/seastore/transaction_manager.h +++ b/src/crimson/os/seastore/transaction_manager.h @@ -188,6 +188,8 @@ public: } }; + template + using lextent_init_func_t = std::function; /** * read_extent * @@ -201,20 +203,22 @@ public: read_extent_ret read_extent( Transaction &t, laddr_t offset, - extent_len_t length) { + extent_len_t length, + lextent_init_func_t maybe_init = [](T&) {}) { LOG_PREFIX(TransactionManager::read_extent); SUBDEBUGT(seastore_tm, "{}~0x{:x} {} ...", t, offset, length, T::TYPE); return get_pin( t, offset - ).si_then([this, FNAME, &t, offset, length] (auto pin) + ).si_then([this, FNAME, &t, offset, length, + maybe_init=std::move(maybe_init)] (auto pin) mutable -> read_extent_ret { if (length != pin->get_length() || !pin->get_val().is_real()) { SUBERRORT(seastore_tm, "{}~0x{:x} {} got wrong pin {}", t, offset, length, T::TYPE, *pin); ceph_abort("Impossible"); } - return this->read_pin(t, std::move(pin)); + return this->read_pin(t, std::move(pin), std::move(maybe_init)); }); } @@ -226,20 +230,22 @@ public: template read_extent_ret read_extent( Transaction &t, - laddr_t offset) { + laddr_t offset, + lextent_init_func_t maybe_init = [](T&) {}) { LOG_PREFIX(TransactionManager::read_extent); SUBDEBUGT(seastore_tm, "{} {} ...", t, offset, T::TYPE); return get_pin( t, offset - ).si_then([this, FNAME, &t, offset] (auto pin) + ).si_then([this, FNAME, &t, offset, + maybe_init=std::move(maybe_init)] (auto pin) mutable -> read_extent_ret { if (!pin->get_val().is_real()) { SUBERRORT(seastore_tm, "{} {} got wrong pin {}", t, offset, T::TYPE, *pin); ceph_abort("Impossible"); } - return this->read_pin(t, std::move(pin)); + return this->read_pin(t, std::move(pin), std::move(maybe_init)); }); } @@ -248,7 +254,8 @@ public: Transaction &t, LBAMappingRef pin, extent_len_t partial_off, - extent_len_t partial_len) + extent_len_t partial_len, + lextent_init_func_t maybe_init = [](T&) {}) { static_assert(is_logical_type(T::TYPE)); assert(is_aligned(partial_off, get_block_size())); @@ -284,7 +291,8 @@ public: pin->maybe_fix_pos(); fut = base_iertr::make_ready_future(std::move(pin)); } - return fut.si_then([&t, this, direct_partial_off, partial_len](auto npin) { + return fut.si_then([&t, this, direct_partial_off, partial_len, + maybe_init=std::move(maybe_init)](auto npin) mutable { // checking the lba child must be atomic with creating // and linking the absent child auto ret = get_extent_if_linked(t, std::move(npin)); @@ -293,10 +301,15 @@ public: ).si_then([direct_partial_off, partial_len, this, &t](auto extent) { return cache->read_extent_maybe_partial( t, std::move(extent), direct_partial_off, partial_len); - }); + }).si_then([maybe_init=std::move(maybe_init)](auto extent) { + maybe_init(*extent); + return extent; + }); } else { return this->pin_to_extent( - t, std::move(std::get<0>(ret)), direct_partial_off, partial_len); + t, std::move(std::get<0>(ret)), + direct_partial_off, partial_len, + std::move(maybe_init)); } }).si_then([FNAME, maybe_indirect_info, is_clone, &t](TCachedExtentRef ext) { if (maybe_indirect_info.has_value()) { @@ -314,10 +327,14 @@ public: template base_iertr::future> read_pin( Transaction &t, - LBAMappingRef pin) + LBAMappingRef pin, + lextent_init_func_t maybe_init = [](T&) {}) { auto& pin_ref = *pin; - return read_pin(t, std::move(pin), 0, pin_ref.get_length()); + return read_pin( + t, std::move(pin), 0, + pin_ref.get_length(), + std::move(maybe_init)); } /// Obtain mutable copy of extent @@ -1010,7 +1027,8 @@ private: Transaction &t, LBAMappingRef pin, extent_len_t direct_partial_off, - extent_len_t partial_len) { + extent_len_t partial_len, + lextent_init_func_t &&maybe_init) { static_assert(is_logical_type(T::TYPE)); using ret = pin_to_extent_ret; auto &pref = *pin; @@ -1030,7 +1048,7 @@ private: direct_length, direct_partial_off, partial_len, - [&pref] + [&pref, maybe_init=std::move(maybe_init)] (T &extent) mutable { assert(extent.is_logical()); assert(!extent.has_laddr()); @@ -1039,6 +1057,7 @@ private: assert(pref.get_parent()); pref.link_child(&extent); extent.maybe_set_intermediate_laddr(pref); + maybe_init(extent); } ).si_then([FNAME, &t, pin=std::move(pin), this](auto ref) mutable -> ret { if (ref->is_fully_loaded()) {