From: Ilya Dryomov Date: Thu, 28 Dec 2023 09:14:18 +0000 (+0100) Subject: librbd: propagate diff-iterate range to parent in fast-diff mode X-Git-Tag: v17.2.8~538^2~9 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=22141b0666f3226bb9e44929716a7f10f983dd19;p=ceph.git librbd: propagate diff-iterate range to parent in fast-diff mode 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 (cherry picked from commit 7677d4b1b52ab68484545d0fcd7348f2f8e9f263) Conflicts: src/librbd/api/DiffIterate.cc [ ImageArea support not in quincy ] --- diff --git a/src/librbd/api/DiffIterate.cc b/src/librbd/api/DiffIterate.cc index 9b5be04e06bf..1cf042fe1f02 100644 --- a/src/librbd/api/DiffIterate.cc +++ b/src/librbd/api/DiffIterate.cc @@ -293,10 +293,14 @@ int DiffIterate::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;