]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: tweak ReadResult's handler for SparseBufferlist type 68202/head
authorIlya Dryomov <idryomov@gmail.com>
Fri, 16 Jan 2026 19:38:48 +0000 (20:38 +0100)
committerIlya Dryomov <idryomov@gmail.com>
Thu, 16 Apr 2026 08:15:09 +0000 (10:15 +0200)
It's similar in concept to the handler for the new ChildObject type.
To highlight that, make comments and log messages consistent between
the two.

Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
src/librbd/io/ReadResult.cc

index fc1d9bf361f81fb0cacc34d170ab7622e8598129..bb522319483b25acd7f2e8c9d2ccfbc5cff2f109 100644 (file)
@@ -95,42 +95,51 @@ struct ReadResult::AssembleResultVisitor {
     auto buffer_extents_length = destriper.assemble_result(
       cct, &buffer_extent_map, sparse_bufferlist.bl);
 
-    ldout(cct, 20) << "image_extents="
-                   << sparse_bufferlist.image_extents << ", "
-                   << "buffer_extent_map=" << buffer_extent_map << dendl;
+    ldout(cct, 20) << "buffer_extent_map=" << buffer_extent_map << dendl;
 
     sparse_bufferlist.extent_map->clear();
     sparse_bufferlist.extent_map->reserve(buffer_extent_map.size());
 
-    // The extent-map is logically addressed by buffer-extents not image- or
-    // object-extents. Translate this address mapping to image-extent
-    // logical addressing since it's tied to an image-extent read
+    // buffer_extent_map is logically addressed by buffer extents not
+    // image or object extents. Translate buffer offsets (always 0-based)
+    // into image offsets since the buffer is tied to an image read.
     uint64_t buffer_offset = 0;
     auto bem_it = buffer_extent_map.begin();
     for (auto [image_offset, image_length] : sparse_bufferlist.image_extents) {
+      bool found_buffer_extent = false;
       while (bem_it != buffer_extent_map.end()) {
         auto [buffer_extent_offset, buffer_extent_length] = *bem_it;
 
         if (buffer_offset + image_length <= buffer_extent_offset) {
-          // skip any image extent that is not included in the results
+          // no more buffer extents for the current image extent,
+          // current buffer extent belongs to the next image extent
           break;
         }
 
-        // current buffer-extent should be within the current image-extent
+        // current buffer extent should be within the current image extent
         ceph_assert(buffer_offset <= buffer_extent_offset &&
                     buffer_offset + image_length >=
                       buffer_extent_offset + buffer_extent_length);
+        found_buffer_extent = true;
+
         auto image_extent_offset =
           image_offset + (buffer_extent_offset - buffer_offset);
         ldout(cct, 20) << "mapping buffer extent " << buffer_extent_offset
                        << "~" << buffer_extent_length << " to image extent "
                        << image_extent_offset << "~" << buffer_extent_length
+                       << " for " << image_offset << "~" << image_length
                        << dendl;
         sparse_bufferlist.extent_map->emplace_back(
           image_extent_offset, buffer_extent_length);
         ++bem_it;
       }
 
+      // skip any image extent that is not included in the results
+      if (!found_buffer_extent) {
+        ldout(cct, 20) << "no buffer extents for image extent "
+                       << image_offset << "~" << image_length << dendl;
+      }
+
       buffer_offset += image_length;
     }
     ceph_assert(buffer_offset == buffer_extents_length);