From 59d692f8f05d78124f5e0adbcdfcac18d7522eec Mon Sep 17 00:00:00 2001 From: Yingxin Cheng Date: Thu, 24 Oct 2024 13:45:55 +0800 Subject: [PATCH] crimson/os/seastore/transaction_manager: fix to use direct key/length to get absent extent Signed-off-by: Yingxin Cheng --- src/crimson/os/seastore/transaction_manager.h | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/crimson/os/seastore/transaction_manager.h b/src/crimson/os/seastore/transaction_manager.h index 5cba9c4ab38..e81ce553336 100644 --- a/src/crimson/os/seastore/transaction_manager.h +++ b/src/crimson/os/seastore/transaction_manager.h @@ -920,12 +920,13 @@ private: static_assert(is_logical_type(T::TYPE)); using ret = pin_to_extent_ret; auto &pref = *pin; + auto direct_length = pref.is_indirect() ? + pref.get_intermediate_length() : + pref.get_length(); return cache->get_absent_extent( t, pref.get_val(), - pref.is_indirect() ? - pref.get_intermediate_length() : - pref.get_length(), + direct_length, [&pref] (T &extent) mutable { assert(!extent.has_laddr()); @@ -984,14 +985,21 @@ private: t, *pin, type); assert(is_logical_type(type)); auto &pref = *pin; + laddr_t direct_key; + extent_len_t direct_length; + if (pref.is_indirect()) { + direct_key = pref.get_intermediate_base(); + direct_length = pref.get_intermediate_length(); + } else { + direct_key = pref.get_key(); + direct_length = pref.get_length(); + } return cache->get_absent_extent_by_type( t, type, pref.get_val(), - pref.get_key(), - pref.is_indirect() ? - pref.get_intermediate_length() : - pref.get_length(), + direct_key, + direct_length, [&pref](CachedExtent &extent) mutable { auto &lextent = static_cast(extent); assert(!lextent.has_laddr()); -- 2.47.3