mirror of
https://github.com/ceph/ceph
synced 2025-02-22 18:47:18 +00:00
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 <idryomov@gmail.com>
This commit is contained in:
parent
0b5ba5fedf
commit
7677d4b1b5
@ -293,12 +293,14 @@ int DiffIterate<I>::execute() {
|
||||
std::shared_lock image_locker{m_image_ctx.image_lock};
|
||||
uint64_t raw_overlap = 0;
|
||||
m_image_ctx.get_parent_overlap(m_image_ctx.snap_id, &raw_overlap);
|
||||
auto overlap = m_image_ctx.reduce_parent_overlap(raw_overlap, false);
|
||||
if (overlap.first > 0 && overlap.second == io::ImageArea::DATA) {
|
||||
io::Extents parent_extents = {{m_offset, m_length}};
|
||||
if (m_image_ctx.prune_parent_extents(parent_extents, io::ImageArea::DATA,
|
||||
raw_overlap, false) > 0) {
|
||||
ldout(cct, 10) << " first getting parent diff" << dendl;
|
||||
DiffIterate diff_parent(*m_image_ctx.parent, {}, nullptr, 0,
|
||||
overlap.first, 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;
|
||||
|
Loading…
Reference in New Issue
Block a user