From 384fdb56c0083b7e6dbffa3357865ddb1138bd45 Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Mon, 20 Apr 2020 18:50:43 -0400 Subject: [PATCH] librbd: permit mirroring to be enabled upon image cloning The librbd clone API's ImageOptions parameter now supports passing the mirror image mode. Signed-off-by: Jason Dillaman (cherry picked from commit 407f2e5c172cf5bef49a28b3156099487e7c2bf6) --- src/librbd/image/CloneRequest.cc | 8 ++++++++ src/test/librbd/test_librbd.cc | 26 ++++++++++++++++++++------ 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/src/librbd/image/CloneRequest.cc b/src/librbd/image/CloneRequest.cc index 05664d24df793..558990ef2ef4d 100644 --- a/src/librbd/image/CloneRequest.cc +++ b/src/librbd/image/CloneRequest.cc @@ -426,9 +426,16 @@ template void CloneRequest::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( + mirror_image_mode); + enable_mirror(); + return; } else if (!m_imctx->test_features(RBD_FEATURE_JOURNALING)) { close_child(); return; @@ -461,6 +468,7 @@ void CloneRequest::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; } diff --git a/src/test/librbd/test_librbd.cc b/src/test/librbd/test_librbd.cc index d091fd7ca5a04..2c83af9839b4c 100644 --- a/src/test/librbd/test_librbd.cc +++ b/src/test/librbd/test_librbd.cc @@ -6606,17 +6606,31 @@ TEST_F(TestLibRBD, CreateWithMirrorEnabled) { RBD_IMAGE_OPTION_MIRROR_IMAGE_MODE, static_cast(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)); } -- 2.39.5