]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: copy-on-read should skip copyup if deep-copy invoked
authorJason Dillaman <dillaman@redhat.com>
Tue, 22 Sep 2020 23:01:27 +0000 (19:01 -0400)
committerJason Dillaman <dillaman@redhat.com>
Tue, 13 Oct 2020 12:40:29 +0000 (08:40 -0400)
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/librbd/io/CopyupRequest.cc
src/librbd/io/CopyupRequest.h
src/test/librbd/io/test_mock_CopyupRequest.cc

index c03b4d0b7dc699f619946ef466827f6030416b81..64dd594526812fb9d1b0c9b22261b0fb1791cd76 100644 (file)
@@ -247,6 +247,7 @@ void CopyupRequest<I>::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<I>::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();
index 24e65b4d5e93462953da537dba58d12750f08759..51368cc583797e7175a18311684e8253a8630aca 100644 (file)
@@ -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<uint64_t, uint64_t> m_copyup_extent_map;
   ceph::bufferlist m_copyup_data;
index 8f20bba9a484a3856e7639d3e284b2b410389fe7..458010f89db736a8fed24ac276b5d287adb40a37 100644 (file)
@@ -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;