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;
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;
}
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));
}