From 9cdcd06caadef6cdca64a974c6525ba300c1e289 Mon Sep 17 00:00:00 2001 From: Xuehan Xu Date: Wed, 12 Jul 2023 18:35:17 +0800 Subject: [PATCH] crimson/os/seastore/object_data_handler: take indirect offset into account when reading object data Signed-off-by: Xuehan Xu --- .../os/seastore/object_data_handler.cc | 37 ++++++++++++++----- src/crimson/os/seastore/transaction_manager.h | 8 +++- 2 files changed, 34 insertions(+), 11 deletions(-) diff --git a/src/crimson/os/seastore/object_data_handler.cc b/src/crimson/os/seastore/object_data_handler.cc index a82668eb02553..0da4c9a38efe5 100644 --- a/src/crimson/os/seastore/object_data_handler.cc +++ b/src/crimson/os/seastore/object_data_handler.cc @@ -730,14 +730,15 @@ operate_ret operate_left(context_t ctx, LBAMappingRef &pin, const overwrite_plan std::nullopt, std::nullopt); } else { + extent_len_t off = pin->get_intermediate_offset(); return ctx.tm.read_pin( ctx.t, pin->duplicate() - ).si_then([prepend_len](auto left_extent) { + ).si_then([prepend_len, off](auto left_extent) { return get_iertr::make_ready_future( std::nullopt, std::make_optional(bufferptr( left_extent->get_bptr(), - 0, + off, prepend_len))); }); } @@ -758,9 +759,10 @@ operate_ret operate_left(context_t ctx, LBAMappingRef &pin, const overwrite_plan std::move(left_to_write_extent), std::nullopt); } else { + extent_len_t off = pin->get_intermediate_offset(); return ctx.tm.read_pin( ctx.t, pin->duplicate() - ).si_then([prepend_offset=extent_len, prepend_len, + ).si_then([prepend_offset=extent_len + off, prepend_len, left_to_write_extent=std::move(left_to_write_extent)] (auto left_extent) mutable { return get_iertr::make_ready_future( @@ -811,7 +813,10 @@ operate_ret operate_right(context_t ctx, LBAMappingRef &pin, const overwrite_pla std::nullopt, std::nullopt); } else { - auto append_offset = overwrite_plan.data_end - right_pin_begin; + auto append_offset = + overwrite_plan.data_end + - right_pin_begin + + pin->get_intermediate_offset(); return ctx.tm.read_pin( ctx.t, pin->duplicate() ).si_then([append_offset, append_len](auto right_extent) { @@ -840,7 +845,10 @@ operate_ret operate_right(context_t ctx, LBAMappingRef &pin, const overwrite_pla std::move(right_to_write_extent), std::nullopt); } else { - auto append_offset = overwrite_plan.data_end - right_pin_begin; + auto append_offset = + overwrite_plan.data_end + - right_pin_begin + + pin->get_intermediate_offset(); return ctx.tm.read_pin( ctx.t, pin->duplicate() ).si_then([append_offset, append_len, @@ -1002,7 +1010,7 @@ ObjectDataHandler::clear_ret ObjectDataHandler::trim_data_reservation( bl.append( bufferptr( extent->get_bptr(), - 0, + pin.get_intermediate_offset(), size - pin_offset )); bl.append_zero(append_len); @@ -1352,19 +1360,30 @@ ObjectDataHandler::read_ret ObjectDataHandler::read( } else { auto key = pin->get_key(); bool is_indirect = pin->is_indirect(); + extent_len_t off = pin->get_intermediate_offset(); + DEBUGT("reading {}~{}, indirect: {}, " + "intermediate offset: {}, current: {}, end: {}", + ctx.t, + key, + pin->get_length(), + is_indirect, + off, + current, + end); return ctx.tm.read_pin( ctx.t, std::move(pin) - ).si_then([&ret, ¤t, end, key, is_indirect](auto extent) { + ).si_then([&ret, ¤t, end, key, off, + is_indirect](auto extent) { ceph_assert( is_indirect - ? (key + extent->get_length()) >= end + ? (key - off + extent->get_length()) >= end : (extent->get_laddr() + extent->get_length()) >= end); ceph_assert(end > current); ret.append( bufferptr( extent->get_bptr(), - current - (is_indirect ? key : extent->get_laddr()), + off + current - (is_indirect ? key : extent->get_laddr()), end - current)); current = end; return seastar::now(); diff --git a/src/crimson/os/seastore/transaction_manager.h b/src/crimson/os/seastore/transaction_manager.h index afc7a648886dc..b008ba6bef0d5 100644 --- a/src/crimson/os/seastore/transaction_manager.h +++ b/src/crimson/os/seastore/transaction_manager.h @@ -761,7 +761,9 @@ private: return cache->get_absent_extent( t, pref.get_val(), - pref.get_length(), + pref.is_indirect() ? + pref.get_intermediate_length() : + pref.get_length(), [pin=std::move(pin)] (T &extent) mutable { assert(!extent.has_laddr()); @@ -801,7 +803,9 @@ private: type, pref.get_val(), pref.get_key(), - pref.get_length(), + pref.is_indirect() ? + pref.get_intermediate_length() : + pref.get_length(), [pin=std::move(pin)](CachedExtent &extent) mutable { auto &lextent = static_cast(extent); assert(!lextent.has_laddr()); -- 2.39.5