]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/object_data_handler: allow alloc multiple extents
authorXuehan Xu <xuxuehan@qianxin.com>
Fri, 19 Jan 2024 03:14:39 +0000 (11:14 +0800)
committerXuehan Xu <xuxuehan@qianxin.com>
Mon, 5 Feb 2024 08:27:50 +0000 (16:27 +0800)
for a single request

Signed-off-by: Xuehan Xu <xuxuehan@qianxin.com>
src/crimson/os/seastore/object_data_handler.cc

index 39c0be33d6de4cf28f1855ab392c7ed118afe8ba..96963ea96f7ab78ef07404dd27c9b23c78debc02 100644 (file)
@@ -526,22 +526,27 @@ ObjectDataHandler::write_ret do_insertions(
               ctx.t,
               region.addr,
               region.len);
-       return ctx.tm.alloc_extent<ObjectDataBlock>(
+       return ctx.tm.alloc_data_extents<ObjectDataBlock>(
          ctx.t,
          region.addr,
          region.len
-       ).si_then([&region](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([&region](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"},