]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: mirror image enable/disable should enable/disable journaling
authorMykola Golub <mgolub@suse.com>
Fri, 14 Jun 2019 12:49:36 +0000 (13:49 +0100)
committerMykola Golub <mgolub@suse.com>
Tue, 18 Jun 2019 11:08:58 +0000 (12:08 +0100)
Fixes: https://tracker.ceph.com/issues/40071
Signed-off-by: Mykola Golub <mgolub@suse.com>
src/librbd/api/Mirror.cc
src/test/librbd/test_mirroring.cc

index c5b34ab1228cbdf6b1695c644a30e61dfd69a4d3..ebdf6acef479430f9f38f1abe6e2388426cb5374 100644 (file)
@@ -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<I>::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<I>::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;
index fd34187b2cfb1a4530e032847738ee14ad79a69c..29f734b3b7ee1c552f5ae01309a9353f98c416cd 100644 (file)
@@ -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;