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 106eae6d443..a5c22418293 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 9289e805073..2855ae32988 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 720be6f55aa..df1277b5f82 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 e56a19ca7ed..b1809b59bc7 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 ffa3dbc68a8..83c75141cc0 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 1c6dcfe6766..cd276fdfe85 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 73bd54d7bd3..574dfe2bc03 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 d33ff830539..e2ca1f59be0 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 1d22702d0e9..4c118ec3544 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 e63ea168eb7..7f2fd30ecdf 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