]> 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)
committerJason Dillaman <dillaman@redhat.com>
Thu, 23 Apr 2020 17:19:49 +0000 (13:19 -0400)
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>
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 9289e80507392ab86d037386029f39c679fb02e4..2855ae329889595fbd3d5ee7dfb1b44086e5b4d4 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 e56a19ca7edcf06bb83a5f8d6f61a4367d6134df..b1809b59bc70fea57a47c1238371fef2fe483943 100644 (file)
@@ -494,7 +494,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;