From: Jason Dillaman Date: Tue, 22 Sep 2020 23:01:27 +0000 (-0400) Subject: librbd: copy-on-read should skip copyup if deep-copy invoked X-Git-Tag: v16.1.0~833^2~10 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=c1580e24e132613aace55c4f935a2a7dcf4d6ef0;p=ceph.git librbd: copy-on-read should skip copyup if deep-copy invoked Signed-off-by: Jason Dillaman --- diff --git a/src/librbd/io/CopyupRequest.cc b/src/librbd/io/CopyupRequest.cc index c03b4d0b7dc..64dd5945268 100644 --- a/src/librbd/io/CopyupRequest.cc +++ b/src/librbd/io/CopyupRequest.cc @@ -247,6 +247,7 @@ void CopyupRequest::deep_copy() { ceph_assert(m_image_ctx->parent != nullptr); m_lock.lock(); + m_deep_copied = true; m_flatten = is_copyup_required() ? true : m_image_ctx->migration_info.flatten; m_lock.unlock(); @@ -401,7 +402,7 @@ void CopyupRequest::copyup() { ldout(cct, 20) << dendl; - bool copy_on_read = m_pending_requests.empty(); + bool copy_on_read = m_pending_requests.empty() && !m_deep_copied; bool deep_copyup = !snapc.snaps.empty() && !m_copyup_is_zero; if (m_copyup_is_zero) { m_copyup_data.clear(); diff --git a/src/librbd/io/CopyupRequest.h b/src/librbd/io/CopyupRequest.h index 24e65b4d5e9..51368cc5837 100644 --- a/src/librbd/io/CopyupRequest.h +++ b/src/librbd/io/CopyupRequest.h @@ -86,6 +86,7 @@ private: bool m_flatten = false; bool m_copyup_required = true; bool m_copyup_is_zero = true; + bool m_deep_copied = false; std::map m_copyup_extent_map; ceph::bufferlist m_copyup_data; diff --git a/src/test/librbd/io/test_mock_CopyupRequest.cc b/src/test/librbd/io/test_mock_CopyupRequest.cc index 8f20bba9a48..458010f89db 100644 --- a/src/test/librbd/io/test_mock_CopyupRequest.cc +++ b/src/test/librbd/io/test_mock_CopyupRequest.cc @@ -615,9 +615,6 @@ TEST_F(TestMockIoCopyupRequest, DeepCopyOnRead) { expect_object_map_update(mock_image_ctx, CEPH_NOSNAP, 0, OBJECT_EXISTS, true, 0); - expect_sparse_copyup(mock_image_ctx, CEPH_NOSNAP, ictx->get_object_name(0), - {}, "", 0); - auto req = new MockCopyupRequest(&mock_image_ctx, 0, {{0, 4096}}, {}); mock_image_ctx.copyup_list[0] = req;