From: Mykola Golub Date: Fri, 14 Jun 2019 12:49:36 +0000 (+0100) Subject: librbd: mirror image enable/disable should enable/disable journaling X-Git-Tag: v15.1.0~2423^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=d0058e4706114d96d207782165f4c0edfd701c5b;p=ceph.git librbd: mirror image enable/disable should enable/disable journaling Fixes: https://tracker.ceph.com/issues/40071 Signed-off-by: Mykola Golub --- diff --git a/src/librbd/api/Mirror.cc b/src/librbd/api/Mirror.cc index c5b34ab1228c..ebdf6acef479 100644 --- a/src/librbd/api/Mirror.cc +++ b/src/librbd/api/Mirror.cc @@ -12,6 +12,7 @@ #include "librbd/ImageCtx.h" #include "librbd/ImageState.h" #include "librbd/Journal.h" +#include "librbd/Operations.h" #include "librbd/Utils.h" #include "librbd/api/Image.h" #include "librbd/mirror/DemoteRequest.h" @@ -215,9 +216,16 @@ int Mirror::image_enable(I *ictx, bool relax_same_pool_parent_check) { } } - if ((ictx->features & RBD_FEATURE_JOURNALING) == 0) { - lderr(cct) << "cannot enable mirroring: journaling is not enabled" << dendl; - return -EINVAL; + if (!ictx->test_features(RBD_FEATURE_JOURNALING)) { + uint64_t features = RBD_FEATURE_JOURNALING; + if (!ictx->test_features(RBD_FEATURE_EXCLUSIVE_LOCK)) { + features |= RBD_FEATURE_EXCLUSIVE_LOCK; + } + r = ictx->operations->update_features(features, true); + if (r < 0) { + lderr(cct) << "cannot enable journaling: " << cpp_strerror(r) << dendl; + return r; + } } C_SaferCond ctx; @@ -357,6 +365,12 @@ int Mirror::image_disable(I *ictx, bool force) { rollback = true; return r; } + + r = ictx->operations->update_features(RBD_FEATURE_JOURNALING, false); + if (r < 0) { + lderr(cct) << "cannot disable journaling: " << cpp_strerror(r) << dendl; + // not fatal + } } return 0; diff --git a/src/test/librbd/test_mirroring.cc b/src/test/librbd/test_mirroring.cc index fd34187b2cfb..29f734b3b7ee 100644 --- a/src/test/librbd/test_mirroring.cc +++ b/src/test/librbd/test_mirroring.cc @@ -113,6 +113,14 @@ public: ASSERT_EQ(mirror_state == RBD_MIRROR_IMAGE_ENABLED ? -ENOENT : -EINVAL, image.mirror_image_get_instance_id(&instance_id)); + if (mirror_mode == RBD_MIRROR_MODE_IMAGE && + mirror_state == RBD_MIRROR_IMAGE_DISABLED) { + // disabling image mirroring automatically disables journaling feature + uint64_t new_features; + ASSERT_EQ(0, image.features(&new_features)); + ASSERT_EQ(0, new_features & RBD_FEATURE_JOURNALING); + } + ASSERT_EQ(0, image.close()); ASSERT_EQ(0, m_rbd.remove(m_ioctx, image_name.c_str())); ASSERT_EQ(0, m_rbd.mirror_mode_set(m_ioctx, RBD_MIRROR_MODE_DISABLED)); @@ -381,6 +389,14 @@ TEST_F(TestMirroring, DisableImageMirror_In_MirrorModeImage) { RBD_MIRROR_IMAGE_DISABLED); } +TEST_F(TestMirroring, DisableImageMirror_In_MirrorModeImage_NoObjectMap) { + uint64_t features = 0; + features |= RBD_FEATURE_EXCLUSIVE_LOCK; + features |= RBD_FEATURE_JOURNALING; + check_mirror_image_disable(RBD_MIRROR_MODE_IMAGE, features, 0, + RBD_MIRROR_IMAGE_DISABLED); +} + TEST_F(TestMirroring, DisableImageMirror_In_MirrorModePool) { uint64_t features = 0; features |= RBD_FEATURE_OBJECT_MAP; @@ -470,7 +486,7 @@ TEST_F(TestMirroring, DisableJournalingWithPeer) { ASSERT_EQ(0, m_rbd.mirror_mode_set(m_ioctx, RBD_MIRROR_MODE_DISABLED)); } -TEST_F(TestMirroring, EnableImageMirror_WithoutJournaling) { +TEST_F(TestMirroring, EnableImageMirror_In_MirrorModeDisabled_WithoutJournaling) { uint64_t features = 0; features |= RBD_FEATURE_OBJECT_MAP; features |= RBD_FEATURE_EXCLUSIVE_LOCK; @@ -478,6 +494,28 @@ TEST_F(TestMirroring, EnableImageMirror_WithoutJournaling) { RBD_MIRROR_IMAGE_DISABLED); } +TEST_F(TestMirroring, EnableImageMirror_In_MirrorModePool_WithoutJournaling) { + uint64_t features = 0; + features |= RBD_FEATURE_OBJECT_MAP; + features |= RBD_FEATURE_EXCLUSIVE_LOCK; + check_mirror_image_enable(RBD_MIRROR_MODE_POOL, features, -EINVAL, + RBD_MIRROR_IMAGE_DISABLED); +} + +TEST_F(TestMirroring, EnableImageMirror_In_MirrorModeImage_WithoutJournaling) { + uint64_t features = 0; + features |= RBD_FEATURE_OBJECT_MAP; + features |= RBD_FEATURE_EXCLUSIVE_LOCK; + check_mirror_image_enable(RBD_MIRROR_MODE_IMAGE, features, 0, + RBD_MIRROR_IMAGE_ENABLED); +} + +TEST_F(TestMirroring, EnableImageMirror_In_MirrorModeImage_WithoutExclusiveLock) { + uint64_t features = 0; + check_mirror_image_enable(RBD_MIRROR_MODE_IMAGE, features, 0, + RBD_MIRROR_IMAGE_ENABLED); +} + TEST_F(TestMirroring, CreateImage_In_MirrorModeDisabled) { uint64_t features = 0; features |= RBD_FEATURE_OBJECT_MAP;