From c1580e24e132613aace55c4f935a2a7dcf4d6ef0 Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Tue, 22 Sep 2020 19:01:27 -0400 Subject: [PATCH] librbd: copy-on-read should skip copyup if deep-copy invoked Signed-off-by: Jason Dillaman --- src/librbd/io/CopyupRequest.cc | 3 ++- src/librbd/io/CopyupRequest.h | 1 + src/test/librbd/io/test_mock_CopyupRequest.cc | 3 --- 3 files changed, 3 insertions(+), 4 deletions(-) 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; -- 2.39.5