mirror of
https://github.com/ceph/ceph
synced 2025-01-03 01:22:53 +00:00
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 <dillaman@redhat.com>
This commit is contained in:
parent
e79f6b1c15
commit
1baba64e21
@ -339,7 +339,9 @@ void ObjectCopyRequest<I>::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<I>::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;
|
||||
}
|
||||
|
@ -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<librados::snap_t> SnapIds;
|
||||
|
@ -258,7 +258,7 @@ void CopyupRequest<I>::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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user