From 1baba64e213cb808804796575d3f7969cf37a3c6 Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Tue, 8 Dec 2020 14:16:49 -0500 Subject: [PATCH] librbd/deep_copy: added new migrating flag to object copy The migration operation and the copyup state machine will set this flag when attempting to perform a deep-copy due to a live-migration. This flag will prevent a possible race condition between the start of the object deep-copy when migration was enabled and the writing portion of the deep-copy when migration might have completed via external means. Fixes: https://tracker.ceph.com/issues/45694 Signed-off-by: Jason Dillaman --- src/librbd/deep_copy/ObjectCopyRequest.cc | 6 ++++-- src/librbd/deep_copy/Types.h | 3 ++- src/librbd/io/CopyupRequest.cc | 2 +- src/librbd/operation/MigrateRequest.cc | 2 +- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/librbd/deep_copy/ObjectCopyRequest.cc b/src/librbd/deep_copy/ObjectCopyRequest.cc index 21153cfed08..80b06c15cfb 100644 --- a/src/librbd/deep_copy/ObjectCopyRequest.cc +++ b/src/librbd/deep_copy/ObjectCopyRequest.cc @@ -339,7 +339,9 @@ void ObjectCopyRequest::send_write_object() { << "dst_snaps=" << dst_snap_ids << dendl; librados::ObjectWriteOperation op; - if (!m_dst_image_ctx->migration_info.empty()) { + + bool migration = ((m_flags & OBJECT_COPY_REQUEST_FLAG_MIGRATION) != 0); + if (migration) { ldout(m_cct, 20) << "assert_snapc_seq=" << dst_snap_seq << dendl; cls_client::assert_snapc_seq(&op, dst_snap_seq, cls::rbd::ASSERT_SNAPC_SEQ_GT_SNAPSET_SEQ); @@ -381,7 +383,7 @@ void ObjectCopyRequest::send_write_object() { } } - if (op.size() == (m_dst_image_ctx->migration_info.empty() ? 0 : 1)) { + if (op.size() == (migration ? 1 : 0)) { handle_write_object(0); return; } diff --git a/src/librbd/deep_copy/Types.h b/src/librbd/deep_copy/Types.h index 0b24dae2bec..e6aa980494b 100644 --- a/src/librbd/deep_copy/Types.h +++ b/src/librbd/deep_copy/Types.h @@ -12,7 +12,8 @@ namespace librbd { namespace deep_copy { enum { - OBJECT_COPY_REQUEST_FLAG_FLATTEN = 1U << 0, + OBJECT_COPY_REQUEST_FLAG_FLATTEN = 1U << 0, + OBJECT_COPY_REQUEST_FLAG_MIGRATION = 1U << 1, }; typedef std::vector SnapIds; diff --git a/src/librbd/io/CopyupRequest.cc b/src/librbd/io/CopyupRequest.cc index 43c856173ce..d70851409fd 100644 --- a/src/librbd/io/CopyupRequest.cc +++ b/src/librbd/io/CopyupRequest.cc @@ -258,7 +258,7 @@ void CopyupRequest::deep_copy() { ldout(cct, 20) << "flatten=" << m_flatten << dendl; - uint32_t flags = 0; + uint32_t flags = deep_copy::OBJECT_COPY_REQUEST_FLAG_MIGRATION; if (m_flatten) { flags |= deep_copy::OBJECT_COPY_REQUEST_FLAG_FLATTEN; } diff --git a/src/librbd/operation/MigrateRequest.cc b/src/librbd/operation/MigrateRequest.cc index 487df9970a8..2b9adb77378 100644 --- a/src/librbd/operation/MigrateRequest.cc +++ b/src/librbd/operation/MigrateRequest.cc @@ -128,7 +128,7 @@ private: } else { ceph_assert(image_ctx.parent != nullptr); - uint32_t flags = 0; + uint32_t flags = deep_copy::OBJECT_COPY_REQUEST_FLAG_MIGRATION; if (image_ctx.migration_info.flatten) { flags |= deep_copy::OBJECT_COPY_REQUEST_FLAG_FLATTEN; } -- 2.39.5