From ea64ba5a6f2a73e3440244c0b358b948647670c5 Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Wed, 22 Apr 2020 11:57:45 -0400 Subject: [PATCH] librbd: EnableRequest now accepts a boolean to indicate a clean image If the image is clean, it's treated as if it was newly created and therefore clean since snapshot id 0. The CreateRequest and CloneRequest state machines pass true for this bool if mirroring is being enabled during creation. Signed-off-by: Jason Dillaman --- src/librbd/api/Migration.cc | 2 +- src/librbd/api/Mirror.cc | 2 +- src/librbd/api/Trash.cc | 4 ++-- src/librbd/image/CloneRequest.cc | 2 +- src/librbd/image/CreateRequest.cc | 2 +- src/librbd/mirror/EnableRequest.cc | 9 ++++++--- src/librbd/mirror/EnableRequest.h | 14 ++++++++------ src/librbd/operation/EnableFeaturesRequest.cc | 2 +- src/test/librbd/image/test_mock_CloneRequest.cc | 3 ++- .../operation/test_mock_EnableFeaturesRequest.cc | 2 +- 10 files changed, 24 insertions(+), 18 deletions(-) diff --git a/src/librbd/api/Migration.cc b/src/librbd/api/Migration.cc index 106eae6d4439d..a5c2241829393 100644 --- a/src/librbd/api/Migration.cc +++ b/src/librbd/api/Migration.cc @@ -1505,7 +1505,7 @@ int Migration::enable_mirroring( C_SaferCond ctx; auto req = mirror::EnableRequest::create( - image_ctx, mirror_image_mode, "", &ctx); + image_ctx, mirror_image_mode, "", false, &ctx); req->send(); r = ctx.wait(); if (r < 0) { diff --git a/src/librbd/api/Mirror.cc b/src/librbd/api/Mirror.cc index 9289e80507392..2855ae3298895 100644 --- a/src/librbd/api/Mirror.cc +++ b/src/librbd/api/Mirror.cc @@ -415,7 +415,7 @@ int Mirror::image_enable(I *ictx, mirror_image_mode_t mode, C_SaferCond ctx; auto req = mirror::EnableRequest::create( - ictx, static_cast(mode), "", &ctx); + ictx, static_cast(mode), "", false, &ctx); req->send(); r = ctx.wait(); diff --git a/src/librbd/api/Trash.cc b/src/librbd/api/Trash.cc index 720be6f55aa97..df1277b5f82ae 100644 --- a/src/librbd/api/Trash.cc +++ b/src/librbd/api/Trash.cc @@ -95,8 +95,8 @@ int enable_mirroring(IoCtx &io_ctx, const std::string &image_id) { ImageCtx::get_thread_pool_instance(cct, &thread_pool, &op_work_queue); C_SaferCond ctx; auto req = mirror::EnableRequest::create( - io_ctx, image_id, cls::rbd::MIRROR_IMAGE_MODE_JOURNAL, "", op_work_queue, - &ctx); + io_ctx, image_id, cls::rbd::MIRROR_IMAGE_MODE_JOURNAL, "", false, + op_work_queue, &ctx); req->send(); r = ctx.wait(); if (r < 0) { diff --git a/src/librbd/image/CloneRequest.cc b/src/librbd/image/CloneRequest.cc index e56a19ca7edcf..b1809b59bc70f 100644 --- a/src/librbd/image/CloneRequest.cc +++ b/src/librbd/image/CloneRequest.cc @@ -494,7 +494,7 @@ void CloneRequest::enable_mirror() { Context *ctx = create_context_callback< klass, &klass::handle_enable_mirror>(this); auto req = mirror::EnableRequest::create( - m_imctx, m_mirror_image_mode, m_non_primary_global_image_id, ctx); + m_imctx, m_mirror_image_mode, m_non_primary_global_image_id, true, ctx); req->send(); } diff --git a/src/librbd/image/CreateRequest.cc b/src/librbd/image/CreateRequest.cc index ffa3dbc68a8bb..83c75141cc0d0 100644 --- a/src/librbd/image/CreateRequest.cc +++ b/src/librbd/image/CreateRequest.cc @@ -653,7 +653,7 @@ void CreateRequest::mirror_image_enable() { auto req = mirror::EnableRequest::create( m_io_ctx, m_image_id, m_mirror_image_mode, - m_non_primary_global_image_id, m_op_work_queue, ctx); + m_non_primary_global_image_id, true, m_op_work_queue, ctx); req->send(); } diff --git a/src/librbd/mirror/EnableRequest.cc b/src/librbd/mirror/EnableRequest.cc index 1c6dcfe6766ca..cd276fdfe852a 100644 --- a/src/librbd/mirror/EnableRequest.cc +++ b/src/librbd/mirror/EnableRequest.cc @@ -28,10 +28,12 @@ EnableRequest::EnableRequest(librados::IoCtx &io_ctx, I* image_ctx, cls::rbd::MirrorImageMode mode, const std::string &non_primary_global_image_id, - ContextWQ *op_work_queue, Context *on_finish) + bool image_clean, ContextWQ *op_work_queue, + Context *on_finish) : m_io_ctx(io_ctx), m_image_id(image_id), m_image_ctx(image_ctx), m_mode(mode), m_non_primary_global_image_id(non_primary_global_image_id), - m_op_work_queue(op_work_queue), m_on_finish(on_finish), + m_image_clean(image_clean), m_op_work_queue(op_work_queue), + m_on_finish(on_finish), m_cct(reinterpret_cast(io_ctx.cct())) { } @@ -188,7 +190,8 @@ void EnableRequest::create_primary_snapshot() { EnableRequest, &EnableRequest::handle_create_primary_snapshot>(this); auto req = snapshot::CreatePrimaryRequest::create( - m_image_ctx, m_mirror_image.global_image_id, CEPH_NOSNAP, + m_image_ctx, m_mirror_image.global_image_id, + (m_image_clean ? 0 : CEPH_NOSNAP), snapshot::CREATE_PRIMARY_FLAG_IGNORE_EMPTY_PEERS, &m_snap_id, ctx); req->send(); } diff --git a/src/librbd/mirror/EnableRequest.h b/src/librbd/mirror/EnableRequest.h index 73bd54d7bd343..574dfe2bc03d0 100644 --- a/src/librbd/mirror/EnableRequest.h +++ b/src/librbd/mirror/EnableRequest.h @@ -25,19 +25,20 @@ public: static EnableRequest *create(ImageCtxT *image_ctx, cls::rbd::MirrorImageMode mode, const std::string &non_primary_global_image_id, - Context *on_finish) { + bool image_clean, Context *on_finish) { return new EnableRequest(image_ctx->md_ctx, image_ctx->id, image_ctx, mode, - non_primary_global_image_id, + non_primary_global_image_id, image_clean, image_ctx->op_work_queue, on_finish); } static EnableRequest *create(librados::IoCtx &io_ctx, const std::string &image_id, cls::rbd::MirrorImageMode mode, const std::string &non_primary_global_image_id, - ContextWQ *op_work_queue, Context *on_finish) { + bool image_clean, ContextWQ *op_work_queue, + Context *on_finish) { return new EnableRequest(io_ctx, image_id, nullptr, mode, - non_primary_global_image_id, op_work_queue, - on_finish); + non_primary_global_image_id, image_clean, + op_work_queue, on_finish); } void send(); @@ -78,13 +79,14 @@ private: EnableRequest(librados::IoCtx &io_ctx, const std::string &image_id, ImageCtxT* image_ctx, cls::rbd::MirrorImageMode mode, const std::string &non_primary_global_image_id, - ContextWQ *op_work_queue, Context *on_finish); + bool image_clean, ContextWQ *op_work_queue, Context *on_finish); librados::IoCtx &m_io_ctx; std::string m_image_id; ImageCtxT* m_image_ctx; cls::rbd::MirrorImageMode m_mode; std::string m_non_primary_global_image_id; + bool m_image_clean; ContextWQ *m_op_work_queue; Context *m_on_finish; diff --git a/src/librbd/operation/EnableFeaturesRequest.cc b/src/librbd/operation/EnableFeaturesRequest.cc index d33ff830539aa..e2ca1f59be0c5 100644 --- a/src/librbd/operation/EnableFeaturesRequest.cc +++ b/src/librbd/operation/EnableFeaturesRequest.cc @@ -421,7 +421,7 @@ void EnableFeaturesRequest::send_enable_mirror_image() { &EnableFeaturesRequest::handle_enable_mirror_image>(this); auto req = mirror::EnableRequest::create( - &image_ctx, cls::rbd::MIRROR_IMAGE_MODE_JOURNAL, "", ctx); + &image_ctx, cls::rbd::MIRROR_IMAGE_MODE_JOURNAL, "", false, ctx); req->send(); } diff --git a/src/test/librbd/image/test_mock_CloneRequest.cc b/src/test/librbd/image/test_mock_CloneRequest.cc index 1d22702d0e9fc..4c118ec35445d 100644 --- a/src/test/librbd/image/test_mock_CloneRequest.cc +++ b/src/test/librbd/image/test_mock_CloneRequest.cc @@ -189,8 +189,9 @@ struct EnableRequest { static EnableRequest* create(MockTestImageCtx* image_ctx, cls::rbd::MirrorImageMode mode, const std::string &non_primary_global_image_id, - Context *on_finish) { + bool image_clean, Context *on_finish) { ceph_assert(s_instance != nullptr); + EXPECT_TRUE(image_clean); s_instance->on_finish = on_finish; return s_instance; } diff --git a/src/test/librbd/operation/test_mock_EnableFeaturesRequest.cc b/src/test/librbd/operation/test_mock_EnableFeaturesRequest.cc index e63ea168eb71a..7f2fd30ecdfcb 100644 --- a/src/test/librbd/operation/test_mock_EnableFeaturesRequest.cc +++ b/src/test/librbd/operation/test_mock_EnableFeaturesRequest.cc @@ -97,7 +97,7 @@ public: static EnableRequest *create(MockOperationImageCtx *image_ctx, cls::rbd::MirrorImageMode mirror_image_mode, const std::string& non_primary_global_image_id, - Context *on_finish) { + bool image_clean, Context *on_finish) { ceph_assert(s_instance != nullptr); s_instance->on_finish = on_finish; return s_instance; -- 2.39.5