]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: add force option to DisableFeaturesRequest state machine
authorVenky Shankar <vshankar@redhat.com>
Tue, 20 Sep 2016 05:52:48 +0000 (11:22 +0530)
committerDongsheng Yang <dongsheng.yang@easystack.cn>
Tue, 21 Feb 2017 11:17:26 +0000 (19:17 +0800)
Signed-off-by: Venky Shankar <vshankar@redhat.com>
src/librbd/Operations.cc
src/librbd/operation/DisableFeaturesRequest.cc
src/librbd/operation/DisableFeaturesRequest.h
src/test/librbd/operation/test_mock_DisableFeaturesRequest.cc

index 21581eabd5fce1b004d789dab2fb1344e78fcbf3..3bfb2da29ae10923700eb7ff206ca1532c8dfc3a 100644 (file)
@@ -1329,7 +1329,7 @@ void Operations<I>::execute_update_features(uint64_t features, bool enabled,
   } else {
     operation::DisableFeaturesRequest<I> *req =
       new operation::DisableFeaturesRequest<I>(
-        m_image_ctx, on_finish, journal_op_tid, features);
+        m_image_ctx, on_finish, journal_op_tid, features, false);
     req->send();
   }
 }
index 504f530570021ffa631f0ed8325569430a2c3e34..3c68f136a09354d3dedaefaccd5da60a3a8a9946 100644 (file)
@@ -31,8 +31,10 @@ template <typename I>
 DisableFeaturesRequest<I>::DisableFeaturesRequest(I &image_ctx,
                                                   Context *on_finish,
                                                   uint64_t journal_op_tid,
-                                                  uint64_t features)
-  : Request<I>(image_ctx, on_finish, journal_op_tid), m_features(features) {
+                                                  uint64_t features,
+                                                  bool force)
+  : Request<I>(image_ctx, on_finish, journal_op_tid), m_features(features),
+    m_force(force) {
 }
 
 template <typename I>
@@ -300,7 +302,7 @@ Context *DisableFeaturesRequest<I>::handle_get_mirror_image(int *result) {
     return handle_finish(*result);
   }
 
-  if (mirror_image.state == cls::rbd::MIRROR_IMAGE_STATE_ENABLED) {
+  if ((mirror_image.state == cls::rbd::MIRROR_IMAGE_STATE_ENABLED) && !m_force) {
     lderr(cct) << "cannot disable journaling: image mirroring "
                << "enabled and mirror pool mode set to image"
                << dendl;
@@ -324,7 +326,7 @@ void DisableFeaturesRequest<I>::send_disable_mirror_image() {
     &DisableFeaturesRequest<I>::handle_disable_mirror_image>(this);
 
   mirror::DisableRequest<I> *req =
-    mirror::DisableRequest<I>::create(&image_ctx, false, true, ctx);
+    mirror::DisableRequest<I>::create(&image_ctx, m_force, true, ctx);
   req->send();
 }
 
index e9edaf904c500c2526e8261c46e7998c64e6ae56..436e30a13404c92eae20571163f8642ccbbc8a13 100644 (file)
@@ -20,13 +20,13 @@ class DisableFeaturesRequest : public Request<ImageCtxT> {
 public:
   static DisableFeaturesRequest *create(ImageCtxT &image_ctx, Context *on_finish,
                                         uint64_t journal_op_tid,
-                                        uint64_t features) {
+                                        uint64_t features, bool force) {
     return new DisableFeaturesRequest(image_ctx, on_finish, journal_op_tid,
-                                      features);
+                                      features, force);
   }
 
   DisableFeaturesRequest(ImageCtxT &image_ctx, Context *on_finish,
-                         uint64_t journal_op_tid, uint64_t features);
+                         uint64_t journal_op_tid, uint64_t features, bool force);
 
 protected:
   virtual void send_op();
@@ -102,6 +102,7 @@ private:
    */
 
   uint64_t m_features;
+  bool m_force;
 
   bool m_acquired_lock = false;
   bool m_writes_blocked = false;
index 4d451c71545ea13e61c8e0072d7f6e857bfde95d..7ae6d96a872d383023b6e855443b202b8f33f4df 100644 (file)
@@ -333,7 +333,7 @@ TEST_F(TestMockOperationDisableFeaturesRequest, All) {
 
   C_SaferCond cond_ctx;
   MockDisableFeaturesRequest *req = new MockDisableFeaturesRequest(
-    mock_image_ctx, &cond_ctx, 0, features_to_disable);
+    mock_image_ctx, &cond_ctx, 0, features_to_disable, false);
   {
     RWLock::RLocker owner_locker(mock_image_ctx.owner_lock);
     req->send();
@@ -380,7 +380,7 @@ TEST_F(TestMockOperationDisableFeaturesRequest, ObjectMap) {
   C_SaferCond cond_ctx;
   MockDisableFeaturesRequest *req = new MockDisableFeaturesRequest(
     mock_image_ctx, &cond_ctx, 0,
-    RBD_FEATURE_OBJECT_MAP | RBD_FEATURE_FAST_DIFF);
+    RBD_FEATURE_OBJECT_MAP | RBD_FEATURE_FAST_DIFF, false);
   {
     RWLock::RLocker owner_locker(mock_image_ctx.owner_lock);
     req->send();
@@ -424,7 +424,7 @@ TEST_F(TestMockOperationDisableFeaturesRequest, ObjectMapError) {
   C_SaferCond cond_ctx;
   MockDisableFeaturesRequest *req = new MockDisableFeaturesRequest(
     mock_image_ctx, &cond_ctx, 0,
-    RBD_FEATURE_OBJECT_MAP | RBD_FEATURE_FAST_DIFF);
+    RBD_FEATURE_OBJECT_MAP | RBD_FEATURE_FAST_DIFF, false);
   {
     RWLock::RLocker owner_locker(mock_image_ctx.owner_lock);
     req->send();
@@ -467,7 +467,7 @@ TEST_F(TestMockOperationDisableFeaturesRequest, Mirroring) {
 
   C_SaferCond cond_ctx;
   MockDisableFeaturesRequest *req = new MockDisableFeaturesRequest(
-    mock_image_ctx, &cond_ctx, 0, RBD_FEATURE_JOURNALING);
+    mock_image_ctx, &cond_ctx, 0, RBD_FEATURE_JOURNALING, false);
   {
     RWLock::RLocker owner_locker(mock_image_ctx.owner_lock);
     req->send();
@@ -510,7 +510,7 @@ TEST_F(TestMockOperationDisableFeaturesRequest, MirroringError) {
 
   C_SaferCond cond_ctx;
   MockDisableFeaturesRequest *req = new MockDisableFeaturesRequest(
-    mock_image_ctx, &cond_ctx, 0, RBD_FEATURE_JOURNALING);
+    mock_image_ctx, &cond_ctx, 0, RBD_FEATURE_JOURNALING, false);
   {
     RWLock::RLocker owner_locker(mock_image_ctx.owner_lock);
     req->send();