]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: permit mirroring to be enabled upon image cloning
authorJason Dillaman <dillaman@redhat.com>
Mon, 20 Apr 2020 22:50:43 +0000 (18:50 -0400)
committerJason Dillaman <dillaman@redhat.com>
Thu, 23 Apr 2020 17:19:49 +0000 (13:19 -0400)
The librbd clone API's ImageOptions parameter now supports passing
the mirror image mode.

Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/librbd/image/CloneRequest.cc
src/test/librbd/test_librbd.cc

index cabd061aabeac4176e594bb4ecd09080acc5a242..e56a19ca7edcf06bb83a5f8d6f61a4367d6134df 100644 (file)
@@ -436,9 +436,16 @@ template <typename I>
 void CloneRequest<I>::get_mirror_mode() {
   ldout(m_cct, 15) << dendl;
 
+  uint64_t mirror_image_mode;
   if (!m_non_primary_global_image_id.empty()) {
     enable_mirror();
     return;
+  } else if (m_opts.get(RBD_IMAGE_OPTION_MIRROR_IMAGE_MODE,
+                        &mirror_image_mode) == 0) {
+    m_mirror_image_mode = static_cast<cls::rbd::MirrorImageMode>(
+      mirror_image_mode);
+    enable_mirror();
+    return;
   } else if (!m_imctx->test_features(RBD_FEATURE_JOURNALING)) {
     close_child();
     return;
@@ -471,6 +478,7 @@ void CloneRequest<I>::handle_get_mirror_mode(int r) {
 
     m_r_saved = r;
   } else if (m_mirror_mode == cls::rbd::MIRROR_MODE_POOL) {
+    m_mirror_image_mode = cls::rbd::MIRROR_IMAGE_MODE_JOURNAL;
     enable_mirror();
     return;
   }
index d091fd7ca5a04b8ba9044e8b8f36f673c72e30a4..2c83af9839b4cef897bdb3fde054af9ef9331502 100644 (file)
@@ -6606,17 +6606,31 @@ TEST_F(TestLibRBD, CreateWithMirrorEnabled) {
                  RBD_IMAGE_OPTION_MIRROR_IMAGE_MODE,
                  static_cast<uint64_t>(RBD_MIRROR_IMAGE_MODE_SNAPSHOT)));
 
-  std::string image_name = get_temp_image_name();
-  ASSERT_EQ(0, rbd.create4(ioctx, image_name.c_str(), 2<<20, image_options));
+  std::string parent_name = get_temp_image_name();
+  ASSERT_EQ(0, rbd.create4(ioctx, parent_name.c_str(), 2<<20, image_options));
 
-  librbd::Image image;
-  ASSERT_EQ(0, rbd.open(ioctx, image, image_name.c_str(), NULL));
+  librbd::Image parent_image;
+  ASSERT_EQ(0, rbd.open(ioctx, parent_image, parent_name.c_str(), NULL));
 
   librbd::mirror_image_mode_t mirror_image_mode;
-  ASSERT_EQ(0, image.mirror_image_get_mode(&mirror_image_mode));
+  ASSERT_EQ(0, parent_image.mirror_image_get_mode(&mirror_image_mode));
+  ASSERT_EQ(RBD_MIRROR_IMAGE_MODE_SNAPSHOT, mirror_image_mode);
+
+  ASSERT_EQ(0, parent_image.snap_create("parent_snap"));
+  ASSERT_EQ(0, parent_image.snap_protect("parent_snap"));
+
+  std::string child_name = get_temp_image_name();
+  ASSERT_EQ(0, rbd.clone3(ioctx, parent_name.c_str(), "parent_snap", ioctx,
+            child_name.c_str(), image_options));
+
+  librbd::Image child_image;
+  ASSERT_EQ(0, rbd.open(ioctx, child_image, child_name.c_str(), NULL));
+
+  ASSERT_EQ(0, child_image.mirror_image_get_mode(&mirror_image_mode));
   ASSERT_EQ(RBD_MIRROR_IMAGE_MODE_SNAPSHOT, mirror_image_mode);
 
-  ASSERT_EQ(0, image.mirror_image_disable(true));
+  ASSERT_EQ(0, child_image.mirror_image_disable(true));
+  ASSERT_EQ(0, parent_image.mirror_image_disable(true));
   ASSERT_EQ(0, rbd.mirror_mode_set(ioctx, RBD_MIRROR_MODE_DISABLED));
 }