]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: fix issues with object-map/fast-diff feature interlock 28051/head
authorJason Dillaman <dillaman@redhat.com>
Thu, 9 May 2019 19:37:26 +0000 (15:37 -0400)
committerJason Dillaman <dillaman@redhat.com>
Thu, 9 May 2019 19:37:26 +0000 (15:37 -0400)
Enabling/disabling one should enable/disable the other.

Fixes: http://tracker.ceph.com/issues/39521
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/librbd/operation/DisableFeaturesRequest.cc
src/librbd/operation/EnableFeaturesRequest.cc
src/test/librbd/image/test_mock_RefreshRequest.cc

index a248ec7c427f573f36ecd714c8fa72b3bfd3f9da..dc58a989ab952c5c62be396960ca35e190177cff 100644 (file)
@@ -175,6 +175,13 @@ Context *DisableFeaturesRequest<I>::handle_acquire_exclusive_lock(int *result) {
 
   do {
     m_features &= image_ctx.features;
+
+    // interlock object-map and fast-diff together
+    if (((m_features & RBD_FEATURE_OBJECT_MAP) != 0) ||
+        ((m_features & RBD_FEATURE_FAST_DIFF) != 0)) {
+      m_features |= (RBD_FEATURE_OBJECT_MAP | RBD_FEATURE_FAST_DIFF);
+    }
+
     m_new_features = image_ctx.features & ~m_features;
     m_features_mask = m_features;
 
@@ -188,6 +195,7 @@ Context *DisableFeaturesRequest<I>::handle_acquire_exclusive_lock(int *result) {
         break;
       }
       m_features_mask |= (RBD_FEATURE_OBJECT_MAP |
+                          RBD_FEATURE_FAST_DIFF |
                           RBD_FEATURE_JOURNALING);
     }
     if ((m_features & RBD_FEATURE_FAST_DIFF) != 0) {
index 44938ffee66d5a93620368d17f3cc7dd0d8b5704..e2c1113d0e9fd7396f2aa169b2a6e26b006e592e 100644 (file)
@@ -175,6 +175,13 @@ Context *EnableFeaturesRequest<I>::handle_get_mirror_mode(int *result) {
     }
 
     m_features &= ~image_ctx.features;
+
+    // interlock object-map and fast-diff together
+    if (((m_features & RBD_FEATURE_OBJECT_MAP) != 0) ||
+        ((m_features & RBD_FEATURE_FAST_DIFF) != 0)) {
+      m_features |= (RBD_FEATURE_OBJECT_MAP | RBD_FEATURE_FAST_DIFF);
+    }
+
     m_new_features = image_ctx.features | m_features;
     m_features_mask = m_features;
 
@@ -186,12 +193,13 @@ Context *EnableFeaturesRequest<I>::handle_get_mirror_mode(int *result) {
        break;
       }
       m_enable_flags |= RBD_FLAG_OBJECT_MAP_INVALID;
-      m_features_mask |= RBD_FEATURE_EXCLUSIVE_LOCK;
+      m_features_mask |= (RBD_FEATURE_EXCLUSIVE_LOCK | RBD_FEATURE_FAST_DIFF);
     }
     if ((m_features & RBD_FEATURE_FAST_DIFF) != 0) {
       m_enable_flags |= RBD_FLAG_FAST_DIFF_INVALID;
-      m_features_mask |= (RBD_FEATURE_OBJECT_MAP | RBD_FEATURE_EXCLUSIVE_LOCK);
+      m_features_mask |= (RBD_FEATURE_EXCLUSIVE_LOCK | RBD_FEATURE_OBJECT_MAP);
     }
+
     if ((m_features & RBD_FEATURE_JOURNALING) != 0) {
       if ((m_new_features & RBD_FEATURE_EXCLUSIVE_LOCK) == 0) {
        lderr(cct) << "cannot enable journaling. exclusive-lock must be "
index 4a6cea16e0412c11fe0ee3a005ce0f1f5a94c612..8274e04b1086dd6399586121ddd850b5ac6a70bc 100644 (file)
@@ -829,11 +829,6 @@ TEST_F(TestMockImageRefreshRequest, DisableExclusiveLock) {
                                                    false));
   }
 
-  if (ictx->test_features(RBD_FEATURE_FAST_DIFF)) {
-    ASSERT_EQ(0, ictx->operations->update_features(RBD_FEATURE_FAST_DIFF,
-                                                   false));
-  }
-
   if (ictx->test_features(RBD_FEATURE_OBJECT_MAP)) {
     ASSERT_EQ(0, ictx->operations->update_features(RBD_FEATURE_OBJECT_MAP,
                                                    false));
@@ -884,11 +879,6 @@ TEST_F(TestMockImageRefreshRequest, DisableExclusiveLockWhileAcquiringLock) {
                                                    false));
   }
 
-  if (ictx->test_features(RBD_FEATURE_FAST_DIFF)) {
-    ASSERT_EQ(0, ictx->operations->update_features(RBD_FEATURE_FAST_DIFF,
-                                                   false));
-  }
-
   if (ictx->test_features(RBD_FEATURE_OBJECT_MAP)) {
     ASSERT_EQ(0, ictx->operations->update_features(RBD_FEATURE_OBJECT_MAP,
                                                    false));
@@ -932,11 +922,6 @@ TEST_F(TestMockImageRefreshRequest, JournalDisabledByPolicy) {
                                                    false));
   }
 
-  if (ictx->test_features(RBD_FEATURE_OBJECT_MAP)) {
-    ASSERT_EQ(0, ictx->operations->update_features(RBD_FEATURE_OBJECT_MAP,
-                                                   false));
-  }
-
   ASSERT_EQ(0, ictx->state->refresh());
 
   MockRefreshImageCtx mock_image_ctx(*ictx);
@@ -981,11 +966,6 @@ TEST_F(TestMockImageRefreshRequest, EnableJournalWithExclusiveLock) {
                                                    false));
   }
 
-  if (ictx->test_features(RBD_FEATURE_OBJECT_MAP)) {
-    ASSERT_EQ(0, ictx->operations->update_features(RBD_FEATURE_OBJECT_MAP,
-                                                   false));
-  }
-
   ASSERT_EQ(0, ictx->state->refresh());
 
   MockRefreshImageCtx mock_image_ctx(*ictx);
@@ -1027,11 +1007,6 @@ TEST_F(TestMockImageRefreshRequest, EnableJournalWithoutExclusiveLock) {
   librbd::ImageCtx *ictx;
   ASSERT_EQ(0, open_image(m_image_name, &ictx));
 
-  if (ictx->test_features(RBD_FEATURE_FAST_DIFF)) {
-    ASSERT_EQ(0, ictx->operations->update_features(RBD_FEATURE_FAST_DIFF,
-                                                   false));
-  }
-
   if (ictx->test_features(RBD_FEATURE_OBJECT_MAP)) {
     ASSERT_EQ(0, ictx->operations->update_features(RBD_FEATURE_OBJECT_MAP,
                                                    false));
@@ -1224,11 +1199,6 @@ TEST_F(TestMockImageRefreshRequest, DisableObjectMap) {
                                                    false));
   }
 
-  if (ictx->test_features(RBD_FEATURE_OBJECT_MAP)) {
-    ASSERT_EQ(0, ictx->operations->update_features(RBD_FEATURE_OBJECT_MAP,
-                                                   false));
-  }
-
   ASSERT_EQ(0, ictx->state->refresh());
 
   expect_op_work_queue(mock_image_ctx);