From b35549d714f7e02facdc5536d28ee520221576e1 Mon Sep 17 00:00:00 2001 From: Xuehan Xu Date: Fri, 19 Jan 2024 11:14:39 +0800 Subject: [PATCH] crimson/os/seastore/object_data_handler: allow alloc multiple extents for a single request Signed-off-by: Xuehan Xu --- .../os/seastore/object_data_handler.cc | 29 +++++++++++-------- 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/src/crimson/os/seastore/object_data_handler.cc b/src/crimson/os/seastore/object_data_handler.cc index 39c0be33d6de4..96963ea96f7ab 100644 --- a/src/crimson/os/seastore/object_data_handler.cc +++ b/src/crimson/os/seastore/object_data_handler.cc @@ -526,22 +526,27 @@ ObjectDataHandler::write_ret do_insertions( ctx.t, region.addr, region.len); - return ctx.tm.alloc_extent( + return ctx.tm.alloc_data_extents( ctx.t, region.addr, region.len - ).si_then([®ion](auto extent) { - if (extent->get_laddr() != region.addr) { - logger().debug( - "object_data_handler::do_insertions alloc got addr {}," - " should have been {}", - extent->get_laddr(), - region.addr); - } - ceph_assert(extent->get_laddr() == region.addr); - ceph_assert(extent->get_length() == region.len); + ).si_then([®ion](auto extents) { + auto off = region.addr; + auto left = region.len; auto iter = region.bl->cbegin(); - iter.copy(region.len, extent->get_bptr().c_str()); + for (auto &extent : extents) { + ceph_assert(left >= extent->get_length()); + if (extent->get_laddr() != off) { + logger().debug( + "object_data_handler::do_insertions alloc got addr {}," + " should have been {}", + extent->get_laddr(), + off); + } + iter.copy(extent->get_length(), extent->get_bptr().c_str()); + off += extent->get_length(); + left -= extent->get_length(); + } return ObjectDataHandler::write_iertr::now(); }).handle_error_interruptible( crimson::ct_error::enospc::assert_failure{"unexpected enospc"}, -- 2.39.5