]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: EnableRequest now accepts a boolean to indicate a clean image
authorJason Dillaman <dillaman@redhat.com>
Wed, 22 Apr 2020 15:57:45 +0000 (11:57 -0400)
committerNathan Cutler <ncutler@suse.com>
Wed, 29 Apr 2020 12:06:58 +0000 (14:06 +0200)
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 <dillaman@redhat.com>
(cherry picked from commit ea64ba5a6f2a73e3440244c0b358b948647670c5)

src/librbd/api/Migration.cc
src/librbd/api/Mirror.cc
src/librbd/api/Trash.cc
src/librbd/image/CloneRequest.cc
src/librbd/image/CreateRequest.cc
src/librbd/mirror/EnableRequest.cc
src/librbd/mirror/EnableRequest.h
src/librbd/operation/EnableFeaturesRequest.cc
src/test/librbd/image/test_mock_CloneRequest.cc
src/test/librbd/operation/test_mock_EnableFeaturesRequest.cc

index 106eae6d4439dac2db40b5119fcb523752a59c40..a5c22418293932fc3504e6f675c8c5ff0b6caa8a 100644 (file)
@@ -1505,7 +1505,7 @@ int Migration<I>::enable_mirroring(
 
   C_SaferCond ctx;
   auto req = mirror::EnableRequest<I>::create(
-    image_ctx, mirror_image_mode, "", &ctx);
+    image_ctx, mirror_image_mode, "", false, &ctx);
   req->send();
   r = ctx.wait();
   if (r < 0) {
index 902229d3fa08a1d7ebb82baa29d8b6af3be5466b..ce92b854274418ebcfb04b0895fcd8508d7d2cda 100644 (file)
@@ -415,7 +415,7 @@ int Mirror<I>::image_enable(I *ictx, mirror_image_mode_t mode,
 
   C_SaferCond ctx;
   auto req = mirror::EnableRequest<ImageCtx>::create(
-    ictx, static_cast<cls::rbd::MirrorImageMode>(mode), "", &ctx);
+    ictx, static_cast<cls::rbd::MirrorImageMode>(mode), "", false, &ctx);
   req->send();
 
   r = ctx.wait();
index 720be6f55aa97c22a53f0dd567db5019b2578155..df1277b5f82ae64479a0a714643ca459e6ce22f3 100644 (file)
@@ -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<I>::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) {
index 558990ef2ef4de14433ac1e4e4b8e09901c3d3d8..18c9929fda89e1244a2428ae2b890e2a4a6dd620 100644 (file)
@@ -484,7 +484,7 @@ void CloneRequest<I>::enable_mirror() {
   Context *ctx = create_context_callback<
     klass, &klass::handle_enable_mirror>(this);
   auto req = mirror::EnableRequest<I>::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();
 }
 
index ffa3dbc68a8bbdf2071d6490db198297c02edba6..83c75141cc0d0b8c2b8b9f0cd904bb26bf41b0f9 100644 (file)
@@ -653,7 +653,7 @@ void CreateRequest<I>::mirror_image_enable() {
 
   auto req = mirror::EnableRequest<I>::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();
 }
 
index 1c6dcfe6766cab355e3a280ca6611e16d5cba4ab..cd276fdfe852a05e7e355abea9a68594b63736f5 100644 (file)
@@ -28,10 +28,12 @@ EnableRequest<I>::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<CephContext*>(io_ctx.cct())) {
 }
 
@@ -188,7 +190,8 @@ void EnableRequest<I>::create_primary_snapshot() {
     EnableRequest<I>,
     &EnableRequest<I>::handle_create_primary_snapshot>(this);
   auto req = snapshot::CreatePrimaryRequest<I>::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();
 }
index 73bd54d7bd343e5fe5a77d5f8f2e703925fbc32c..574dfe2bc03d091dd8107d375d1810385ac18c02 100644 (file)
@@ -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;
 
index d33ff830539aa4570e20a70ef12fa79e9636a982..e2ca1f59be0c5e632dbd2911a2689833bafc2acb 100644 (file)
@@ -421,7 +421,7 @@ void EnableFeaturesRequest<I>::send_enable_mirror_image() {
     &EnableFeaturesRequest<I>::handle_enable_mirror_image>(this);
 
   auto req = mirror::EnableRequest<I>::create(
-    &image_ctx, cls::rbd::MIRROR_IMAGE_MODE_JOURNAL, "", ctx);
+    &image_ctx, cls::rbd::MIRROR_IMAGE_MODE_JOURNAL, "", false, ctx);
   req->send();
 }
 
index 1d22702d0e9fc956e45845b6f99434fe4cbd24fa..4c118ec35445d1a77256f4b7e8c768b9b00db701 100644 (file)
@@ -189,8 +189,9 @@ struct EnableRequest<MockTestImageCtx> {
   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;
   }
index e63ea168eb71ae41bfd770352d777abb484a1d1f..7f2fd30ecdfcbbbdfb5904762405a6221104dc08 100644 (file)
@@ -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;