]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: do not record journal events if append is disabled by policy
authorJason Dillaman <dillaman@redhat.com>
Wed, 27 Jul 2016 02:58:24 +0000 (22:58 -0400)
committerMykola Golub <mgolub@mirantis.com>
Fri, 19 Aug 2016 19:59:06 +0000 (22:59 +0300)
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
(cherry picked from commit 405142c615352613e8bacee46e92484eb0c08f26)

src/librbd/AioImageRequest.cc
src/librbd/Journal.cc
src/librbd/Journal.h
src/librbd/operation/Request.cc
src/librbd/operation/Request.h
src/test/librbd/mock/MockJournal.h
src/test/librbd/operation/test_mock_ResizeRequest.cc
src/test/librbd/operation/test_mock_SnapshotRollbackRequest.cc
src/test/librbd/test_mock_fixture.cc
src/test/librbd/test_mock_fixture.h

index 1c2a4b140c0f96fc5973f539faf2fb08949aa7f6..807c7e0699a46ee99cfc0407e03692700d42b40c 100644 (file)
@@ -248,8 +248,8 @@ void AbstractAioImageWrite::send_request() {
                                object_extents);
     }
 
-    journaling = (m_image_ctx.journal != NULL &&
-                  !m_image_ctx.journal->is_journal_replaying());
+    journaling = (m_image_ctx.journal != nullptr &&
+                  m_image_ctx.journal->is_journal_appending());
   }
 
   prune_object_extents(object_extents);
@@ -449,8 +449,8 @@ void AioImageFlush::send_request() {
   bool journaling = false;
   {
     RWLock::RLocker snap_locker(m_image_ctx.snap_lock);
-    journaling = (m_image_ctx.journal != NULL &&
-                  !m_image_ctx.journal->is_journal_replaying());
+    journaling = (m_image_ctx.journal != nullptr &&
+                  m_image_ctx.journal->is_journal_appending());
   }
 
   if (journaling) {
index 671553f5b830d2f31e8c16db911540d89831b69c..f98977bac6dd94a644bf017463a384421bad23a4 100644 (file)
@@ -10,6 +10,7 @@
 #include "librbd/Utils.h"
 #include "cls/journal/cls_journal_types.h"
 #include "journal/Journaler.h"
+#include "journal/Policy.h"
 #include "journal/ReplayEntry.h"
 #include "journal/Settings.h"
 #include "common/errno.h"
@@ -628,6 +629,14 @@ bool Journal<I>::is_journal_replaying() const {
           m_state == STATE_RESTARTING_REPLAY);
 }
 
+template <typename I>
+bool Journal<I>::is_journal_appending() const {
+  assert(m_image_ctx.snap_lock.is_locked());
+  Mutex::Locker locker(m_lock);
+  return (m_state == STATE_READY &&
+          !m_image_ctx.get_journal_policy()->append_disabled());
+}
+
 template <typename I>
 void Journal<I>::wait_for_journal_ready(Context *on_ready) {
   on_ready = create_async_context_callback(m_image_ctx, on_ready);
index 496c8819f963675c766696f46d48d0fcab25cdcb..ba4cfb5d0b152c95d4a3bcc92e1c71203cb25c38 100644 (file)
@@ -111,6 +111,7 @@ public:
 
   bool is_journal_ready() const;
   bool is_journal_replaying() const;
+  bool is_journal_appending() const;
 
   void wait_for_journal_ready(Context *on_ready);
 
index f1ad960d0c444d92c69b795847dcf67bf0d7103b..7534004edc3140a3c19d0353021f08ac26d8c79e 100644 (file)
@@ -76,8 +76,8 @@ bool Request<I>::append_op_event() {
 
   assert(image_ctx.owner_lock.is_locked());
   RWLock::RLocker snap_locker(image_ctx.snap_lock);
-  if (image_ctx.journal != NULL &&
-      !image_ctx.journal->is_journal_replaying()) {
+  if (image_ctx.journal != nullptr &&
+      image_ctx.journal->is_journal_appending()) {
     append_op_event(util::create_context_callback<
       Request<I>, &Request<I>::handle_op_event_safe>(this));
     return true;
@@ -98,8 +98,8 @@ bool Request<I>::commit_op_event(int r) {
   assert(!m_committed_op_event);
   m_committed_op_event = true;
 
-  if (image_ctx.journal != NULL &&
-      !image_ctx.journal->is_journal_replaying()) {
+  if (image_ctx.journal != nullptr &&
+      image_ctx.journal->is_journal_appending()) {
     CephContext *cct = image_ctx.cct;
     ldout(cct, 10) << this << " " << __func__ << ": r=" << r << dendl;
 
index 6a09cb1d63921811d51c4f179c06bb40f4759a53..78993160bf6361cb6446532dceb17a3dc89a0dcd 100644 (file)
@@ -40,14 +40,16 @@ protected:
     assert(can_affect_io());
     RWLock::RLocker owner_locker(image_ctx.owner_lock);
     RWLock::RLocker snap_locker(image_ctx.snap_lock);
-    if (image_ctx.journal != NULL) {
-      Context *ctx = util::create_context_callback<T, MF>(request);
+    if (image_ctx.journal != nullptr) {
       if (image_ctx.journal->is_journal_replaying()) {
+        Context *ctx = util::create_context_callback<T, MF>(request);
         replay_op_ready(ctx);
-      } else {
+        return true;
+      } else if (image_ctx.journal->is_journal_appending()) {
+        Context *ctx = util::create_context_callback<T, MF>(request);
         append_op_event(ctx);
+        return true;
       }
-      return true;
     }
     return false;
   }
index cfcb12c06ec15aa8f996566d0071aecdeb344e27..18f14218190e1661546443c2103fec8691051644 100644 (file)
@@ -28,6 +28,7 @@ struct MockJournal {
 
   MOCK_CONST_METHOD0(is_journal_ready, bool());
   MOCK_CONST_METHOD0(is_journal_replaying, bool());
+  MOCK_CONST_METHOD0(is_journal_appending, bool());
 
   MOCK_METHOD1(wait_for_journal_ready, void(Context *));
 
index d5c1486b9c035cc82d42d8f436cafd72d5d7b077..e3a34bec2a653be64acfe5d462d27ddd52c916e8 100644 (file)
@@ -156,7 +156,7 @@ TEST_F(TestMockOperationResizeRequest, NoOpSuccess) {
 
   InSequence seq;
   expect_block_writes(mock_image_ctx, 0);
-  expect_append_op_event(mock_image_ctx, 0);
+  expect_append_op_event(mock_image_ctx, true, 0);
   expect_unblock_writes(mock_image_ctx);
   expect_commit_op_event(mock_image_ctx, 0);
   ASSERT_EQ(0, when_resize(mock_image_ctx, ictx->size, 0, false));
@@ -175,7 +175,7 @@ TEST_F(TestMockOperationResizeRequest, GrowSuccess) {
 
   InSequence seq;
   expect_block_writes(mock_image_ctx, 0);
-  expect_append_op_event(mock_image_ctx, 0);
+  expect_append_op_event(mock_image_ctx, true, 0);
   expect_unblock_writes(mock_image_ctx);
   expect_grow_object_map(mock_image_ctx);
   expect_block_writes(mock_image_ctx, 0);
@@ -198,7 +198,7 @@ TEST_F(TestMockOperationResizeRequest, ShrinkSuccess) {
 
   InSequence seq;
   expect_block_writes(mock_image_ctx, 0);
-  expect_append_op_event(mock_image_ctx, 0);
+  expect_append_op_event(mock_image_ctx, true, 0);
   expect_unblock_writes(mock_image_ctx);
 
   MockTrimRequest mock_trim_request;
@@ -259,7 +259,7 @@ TEST_F(TestMockOperationResizeRequest, TrimError) {
 
   InSequence seq;
   expect_block_writes(mock_image_ctx, 0);
-  expect_append_op_event(mock_image_ctx, 0);
+  expect_append_op_event(mock_image_ctx, true, 0);
   expect_unblock_writes(mock_image_ctx);
 
   MockTrimRequest mock_trim_request;
@@ -281,7 +281,7 @@ TEST_F(TestMockOperationResizeRequest, InvalidateCacheError) {
 
   InSequence seq;
   expect_block_writes(mock_image_ctx, 0);
-  expect_append_op_event(mock_image_ctx, 0);
+  expect_append_op_event(mock_image_ctx, true, 0);
   expect_unblock_writes(mock_image_ctx);
 
   MockTrimRequest mock_trim_request;
@@ -304,7 +304,7 @@ TEST_F(TestMockOperationResizeRequest, PostBlockWritesError) {
 
   InSequence seq;
   expect_block_writes(mock_image_ctx, 0);
-  expect_append_op_event(mock_image_ctx, 0);
+  expect_append_op_event(mock_image_ctx, true, 0);
   expect_unblock_writes(mock_image_ctx);
   expect_grow_object_map(mock_image_ctx);
   expect_block_writes(mock_image_ctx, -EINVAL);
@@ -326,7 +326,7 @@ TEST_F(TestMockOperationResizeRequest, UpdateHeaderError) {
 
   InSequence seq;
   expect_block_writes(mock_image_ctx, 0);
-  expect_append_op_event(mock_image_ctx, 0);
+  expect_append_op_event(mock_image_ctx, true, 0);
   expect_unblock_writes(mock_image_ctx);
   expect_grow_object_map(mock_image_ctx);
   expect_block_writes(mock_image_ctx, 0);
@@ -351,7 +351,7 @@ TEST_F(TestMockOperationResizeRequest, JournalAppendError) {
 
   InSequence seq;
   expect_block_writes(mock_image_ctx, 0);
-  expect_append_op_event(mock_image_ctx, -EINVAL);
+  expect_append_op_event(mock_image_ctx, true, -EINVAL);
   expect_unblock_writes(mock_image_ctx);
   ASSERT_EQ(-EINVAL, when_resize(mock_image_ctx, ictx->size, 0, false));
 }
index 617333676e6f9672188e417caa9876f1782fa22b..6258229964c44ca34b3d13e371e6f9711156c615 100644 (file)
@@ -198,7 +198,7 @@ TEST_F(TestMockOperationSnapshotRollbackRequest, Success) {
 
   InSequence seq;
   MockResizeRequest mock_resize_request;
-  expect_append_op_event(mock_image_ctx, 0);
+  expect_append_op_event(mock_image_ctx, false, 0);
   expect_block_writes(mock_image_ctx, 0);
   expect_resize(mock_image_ctx, mock_resize_request, 0);
   expect_rollback_object_map(mock_image_ctx, *mock_object_map);
@@ -223,7 +223,7 @@ TEST_F(TestMockOperationSnapshotRollbackRequest, BlockWritesError) {
   expect_op_work_queue(mock_image_ctx);
 
   InSequence seq;
-  expect_append_op_event(mock_image_ctx, 0);
+  expect_append_op_event(mock_image_ctx, false, 0);
   expect_block_writes(mock_image_ctx, -EINVAL);
   expect_commit_op_event(mock_image_ctx, -EINVAL);
   expect_unblock_writes(mock_image_ctx);
@@ -243,7 +243,7 @@ TEST_F(TestMockOperationSnapshotRollbackRequest, SkipResize) {
   expect_op_work_queue(mock_image_ctx);
 
   InSequence seq;
-  expect_append_op_event(mock_image_ctx, 0);
+  expect_append_op_event(mock_image_ctx, false, 0);
   expect_block_writes(mock_image_ctx, 0);
   expect_get_image_size(mock_image_ctx, 345);
   expect_rollback_object_map(mock_image_ctx, *mock_object_map);
@@ -269,7 +269,7 @@ TEST_F(TestMockOperationSnapshotRollbackRequest, ResizeError) {
 
   InSequence seq;
   MockResizeRequest mock_resize_request;
-  expect_append_op_event(mock_image_ctx, 0);
+  expect_append_op_event(mock_image_ctx, false, 0);
   expect_block_writes(mock_image_ctx, 0);
   expect_resize(mock_image_ctx, mock_resize_request, -EINVAL);
   expect_commit_op_event(mock_image_ctx, -EINVAL);
@@ -291,7 +291,7 @@ TEST_F(TestMockOperationSnapshotRollbackRequest, RollbackObjectsError) {
 
   InSequence seq;
   MockResizeRequest mock_resize_request;
-  expect_append_op_event(mock_image_ctx, 0);
+  expect_append_op_event(mock_image_ctx, false, 0);
   expect_block_writes(mock_image_ctx, 0);
   expect_resize(mock_image_ctx, mock_resize_request, 0);
   expect_rollback_object_map(mock_image_ctx, mock_object_map);
@@ -315,7 +315,7 @@ TEST_F(TestMockOperationSnapshotRollbackRequest, InvalidateCacheError) {
 
   InSequence seq;
   MockResizeRequest mock_resize_request;
-  expect_append_op_event(mock_image_ctx, 0);
+  expect_append_op_event(mock_image_ctx, false, 0);
   expect_block_writes(mock_image_ctx, 0);
   expect_resize(mock_image_ctx, mock_resize_request, 0);
   expect_rollback_object_map(mock_image_ctx, *mock_object_map);
index c2644eb534773d660da8786ef174f27fbc379f0c..3fb246d28d37cd02827c964894b9987f1c135d6f 100644 (file)
@@ -84,6 +84,11 @@ void TestMockFixture::initialize_features(librbd::ImageCtx *ictx,
   }
 }
 
+void TestMockFixture::expect_is_journal_appending(librbd::MockJournal &mock_journal,
+                                                  bool appending) {
+  EXPECT_CALL(mock_journal, is_journal_appending()).WillOnce(Return(appending));
+}
+
 void TestMockFixture::expect_is_journal_replaying(librbd::MockJournal &mock_journal) {
   EXPECT_CALL(mock_journal, is_journal_replaying()).WillOnce(Return(false));
 }
@@ -99,9 +104,13 @@ void TestMockFixture::expect_allocate_op_tid(librbd::MockImageCtx &mock_image_ct
   }
 }
 
-void TestMockFixture::expect_append_op_event(librbd::MockImageCtx &mock_image_ctx, int r) {
+void TestMockFixture::expect_append_op_event(librbd::MockImageCtx &mock_image_ctx,
+                                             bool can_affect_io, int r) {
   if (mock_image_ctx.journal != nullptr) {
-    expect_is_journal_replaying(*mock_image_ctx.journal);
+    if (can_affect_io) {
+      expect_is_journal_replaying(*mock_image_ctx.journal);
+    }
+    expect_is_journal_appending(*mock_image_ctx.journal, true);
     expect_allocate_op_tid(mock_image_ctx);
     EXPECT_CALL(*mock_image_ctx.journal, append_op_event_mock(_, _, _))
                   .WillOnce(WithArg<2>(CompleteContext(r, mock_image_ctx.image_ctx->op_work_queue)));
@@ -110,7 +119,7 @@ void TestMockFixture::expect_append_op_event(librbd::MockImageCtx &mock_image_ct
 
 void TestMockFixture::expect_commit_op_event(librbd::MockImageCtx &mock_image_ctx, int r) {
   if (mock_image_ctx.journal != nullptr) {
-    expect_is_journal_replaying(*mock_image_ctx.journal);
+    expect_is_journal_appending(*mock_image_ctx.journal, true);
     expect_is_journal_ready(*mock_image_ctx.journal);
     EXPECT_CALL(*mock_image_ctx.journal, commit_op_event(1U, r, _))
                   .WillOnce(WithArg<2>(CompleteContext(r, mock_image_ctx.image_ctx->op_work_queue)));
index bd5a2ac84c686fb73e4ea5202b523391a9c4aa2c..b06ca5bf7209cc763c0eb23c53bd1b3e7a738699 100644 (file)
@@ -80,10 +80,13 @@ public:
                            librbd::MockJournal &mock_journal,
                            librbd::MockObjectMap &mock_object_map);
 
+  void expect_is_journal_appending(librbd::MockJournal &mock_journal,
+                                   bool appending);
   void expect_is_journal_replaying(librbd::MockJournal &mock_journal);
   void expect_is_journal_ready(librbd::MockJournal &mock_journal);
   void expect_allocate_op_tid(librbd::MockImageCtx &mock_image_ctx);
-  void expect_append_op_event(librbd::MockImageCtx &mock_image_ctx, int r);
+  void expect_append_op_event(librbd::MockImageCtx &mock_image_ctx,
+                              bool can_affect_io, int r);
   void expect_commit_op_event(librbd::MockImageCtx &mock_image_ctx, int r);
 
 private: