]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: properly close and destroy journal when dynamically disabled
authorJason Dillaman <dillaman@redhat.com>
Tue, 27 Jun 2017 19:13:32 +0000 (15:13 -0400)
committerJason Dillaman <dillaman@redhat.com>
Tue, 27 Jun 2017 19:13:32 +0000 (15:13 -0400)
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/librbd/operation/DisableFeaturesRequest.cc
src/librbd/operation/DisableFeaturesRequest.h
src/test/librbd/operation/test_mock_DisableFeaturesRequest.cc

index 41eddbd7c8c0e3a7b08a7c90df986148dac1b39f..34cc9579fe84567a41fdf6c7cd4a400cc6dfddbc 100644 (file)
@@ -354,14 +354,14 @@ void DisableFeaturesRequest<I>::send_close_journal() {
   {
     RWLock::WLocker locker(image_ctx.owner_lock);
     if (image_ctx.journal != nullptr) {
-
       ldout(cct, 20) << this << " " << __func__ << dendl;
 
+      std::swap(m_journal, image_ctx.journal);
       Context *ctx = create_context_callback<
        DisableFeaturesRequest<I>,
        &DisableFeaturesRequest<I>::handle_close_journal>(this);
 
-      image_ctx.journal->close(ctx);
+      m_journal->close(ctx);
       return;
     }
   }
@@ -378,9 +378,12 @@ Context *DisableFeaturesRequest<I>::handle_close_journal(int *result) {
   if (*result < 0) {
     lderr(cct) << "failed to close image journal: " << cpp_strerror(*result)
                << dendl;
-    return handle_finish(*result);
   }
 
+  assert(m_journal != nullptr);
+  delete m_journal;
+  m_journal = nullptr;
+
   send_remove_journal();
   return nullptr;
 }
index 623eb1f87dca6614eff6222ab73ad68ea5aa924e..b064bc45f79380a4cd8c30cf98a0a0c1e5140833 100644 (file)
@@ -4,6 +4,7 @@
 #ifndef CEPH_LIBRBD_OPERATION_DISABLE_FEATURES_REQUEST_H
 #define CEPH_LIBRBD_OPERATION_DISABLE_FEATURES_REQUEST_H
 
+#include "librbd/ImageCtx.h"
 #include "librbd/operation/Request.h"
 #include "cls/rbd/cls_rbd_client.h"
 
@@ -113,6 +114,7 @@ private:
   uint64_t m_disable_flags = 0;
   uint64_t m_features_mask = 0;
 
+  decltype(ImageCtxT::journal) m_journal = nullptr;
   cls::rbd::MirrorMode m_mirror_mode = cls::rbd::MIRROR_MODE_DISABLED;
   bufferlist m_out_bl;
 
index 7ae6d96a872d383023b6e855443b202b8f33f4df..dcbfa2ec2aa8d1c14186253828183d84b102a632 100644 (file)
@@ -292,9 +292,13 @@ TEST_F(TestMockOperationDisableFeaturesRequest, All) {
 
   MockOperationImageCtx mock_image_ctx(*ictx);
   MockExclusiveLock mock_exclusive_lock;
-  MockJournal mock_journal;
+  MockJournal mock_journal_stack;
+  MockJournal *mock_journal = &mock_journal_stack;
+  if (features_to_disable & RBD_FEATURE_JOURNALING) {
+    mock_journal = new MockJournal();
+  }
   MockObjectMap mock_object_map;
-  initialize_features(ictx, mock_image_ctx, mock_exclusive_lock, mock_journal,
+  initialize_features(ictx, mock_image_ctx, mock_exclusive_lock, *mock_journal,
                      mock_object_map);
 
   expect_verify_lock_ownership(mock_image_ctx);
@@ -440,9 +444,9 @@ TEST_F(TestMockOperationDisableFeaturesRequest, Mirroring) {
 
   MockOperationImageCtx mock_image_ctx(*ictx);
   MockExclusiveLock mock_exclusive_lock;
-  MockJournal mock_journal;
+  MockJournal *mock_journal = new MockJournal();
   MockObjectMap mock_object_map;
-  initialize_features(ictx, mock_image_ctx, mock_exclusive_lock, mock_journal,
+  initialize_features(ictx, mock_image_ctx, mock_exclusive_lock, *mock_journal,
                      mock_object_map);
 
   expect_verify_lock_ownership(mock_image_ctx);
@@ -483,9 +487,9 @@ TEST_F(TestMockOperationDisableFeaturesRequest, MirroringError) {
 
   MockOperationImageCtx mock_image_ctx(*ictx);
   MockExclusiveLock mock_exclusive_lock;
-  MockJournal mock_journal;
+  MockJournal *mock_journal = new MockJournal();
   MockObjectMap mock_object_map;
-  initialize_features(ictx, mock_image_ctx, mock_exclusive_lock, mock_journal,
+  initialize_features(ictx, mock_image_ctx, mock_exclusive_lock, *mock_journal,
                      mock_object_map);
 
   expect_verify_lock_ownership(mock_image_ctx);