]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: propagate diff-iterate range to parent in fast-diff mode
authorIlya Dryomov <idryomov@gmail.com>
Thu, 28 Dec 2023 09:14:18 +0000 (10:14 +0100)
committerIlya Dryomov <idryomov@gmail.com>
Sat, 20 Jan 2024 15:33:32 +0000 (16:33 +0100)
When getting parent diff, pass the overlap-reduced image extent instead
of the entire 0..overlap range to avoid a similar quadratic slowdown on
cloned images.

Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
(cherry picked from commit 7677d4b1b52ab68484545d0fcd7348f2f8e9f263)

Conflicts:
src/librbd/api/DiffIterate.cc [ ImageArea support not in
  pacific ]

src/librbd/api/DiffIterate.cc

index 5210606008e090d0875daf127a6118bd9fd0e6ab..31d8bd5a1e30f6fc9cbcc4afdf7e4d2b7e907d6f 100644 (file)
@@ -293,10 +293,14 @@ int DiffIterate<I>::execute() {
         std::shared_lock image_locker{m_image_ctx.image_lock};
         uint64_t overlap = 0;
         m_image_ctx.get_parent_overlap(m_image_ctx.snap_id, &overlap);
-        if (m_image_ctx.parent && overlap > 0) {
+        io::Extents parent_extents = {{m_offset, m_length}};
+        if (m_image_ctx.parent &&
+            m_image_ctx.prune_parent_extents(parent_extents, overlap) > 0) {
           ldout(cct, 10) << " first getting parent diff" << dendl;
-          DiffIterate diff_parent(*m_image_ctx.parent, {}, nullptr, 0, overlap,
-                                  true, true, &simple_diff_cb, &parent_diff);
+          DiffIterate diff_parent(*m_image_ctx.parent, {}, nullptr,
+                                  parent_extents[0].first,
+                                  parent_extents[0].second, true, true,
+                                  &simple_diff_cb, &parent_diff);
           r = diff_parent.execute();
           if (r < 0) {
             return r;