]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/os/seastore/object_data_handler: fiemap return laddr continuous wip-seastore-aggregate-read wip-seastore-aggregate-read-qa
authorXuehan Xu <xuxuehan@qianxin.com>
Wed, 24 Sep 2025 06:52:17 +0000 (14:52 +0800)
committerXuehan Xu <xuxuehan@qianxin.com>
Wed, 4 Feb 2026 04:59:36 +0000 (12:59 +0800)
mappings as a single region

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

index b6fc0fb74766f5627b775ab6248927c4761f0eee..0e582e80851bd013d5fc63bfcf58525683515b8e 100644 (file)
@@ -1620,6 +1620,7 @@ ObjectDataHandler::fiemap_ret ObjectDataHandler::fiemap(
       ).si_then([l_start, len, &object_data, &ret](auto &&pins) {
        ceph_assert(pins.size() >= 1);
         ceph_assert(pins.front().get_key() <= l_start);
+       auto off = l_start;
        for (auto &&i: pins) {
          if (!i.is_zero_reserved()) {
            laddr_offset_t ret_left = std::max(laddr_offset_t(i.get_key(), 0), l_start);
@@ -1627,12 +1628,17 @@ ObjectDataHandler::fiemap_ret ObjectDataHandler::fiemap(
              i.get_key() + i.get_length(),
              l_start + len);
            assert(ret_right > ret_left);
-           ret.emplace(
-             std::make_pair(
-               ret_left.get_byte_distance<uint64_t>(
-                 object_data.get_reserved_data_base()),
-               ret_right.get_byte_distance<uint64_t>(ret_left)
-             ));
+           if (off == ret_left && !ret.empty()) {
+             ret.rbegin()->second += ret_right.get_byte_distance<uint64_t>(ret_left);
+           } else {
+             ret.emplace(
+               std::make_pair(
+                 ret_left.get_byte_distance<uint64_t>(
+                   object_data.get_reserved_data_base()),
+                 ret_right.get_byte_distance<uint64_t>(ret_left)
+               ));
+           }
+           off = ret_right;
          }
        }
       });