]> git.apps.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)
committerNathan Cutler <ncutler@suse.com>
Wed, 29 Apr 2020 12:06:58 +0000 (14:06 +0200)
The librbd clone API's ImageOptions parameter now supports passing
the mirror image mode.

Signed-off-by: Jason Dillaman <dillaman@redhat.com>
(cherry picked from commit 407f2e5c172cf5bef49a28b3156099487e7c2bf6)

src/librbd/image/CloneRequest.cc
src/test/librbd/test_librbd.cc

index 05664d24df793262eeb2fa934fad097709b0ecc9..558990ef2ef4de14433ac1e4e4b8e09901c3d3d8 100644 (file)
@@ -426,9 +426,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;
@@ -461,6 +468,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));
 }