From e83866bcf01f32c35af94a47ee614361b4a787e6 Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Tue, 26 Jul 2016 22:58:24 -0400 Subject: [PATCH] librbd: do not record journal events if append is disabled by policy Signed-off-by: Jason Dillaman (cherry picked from commit 405142c615352613e8bacee46e92484eb0c08f26) --- src/librbd/AioImageRequest.cc | 8 ++++---- src/librbd/Journal.cc | 9 +++++++++ src/librbd/Journal.h | 1 + src/librbd/operation/Request.cc | 8 ++++---- src/librbd/operation/Request.h | 10 ++++++---- src/test/librbd/mock/MockJournal.h | 1 + .../librbd/operation/test_mock_ResizeRequest.cc | 16 ++++++++-------- .../test_mock_SnapshotRollbackRequest.cc | 12 ++++++------ src/test/librbd/test_mock_fixture.cc | 15 ++++++++++++--- src/test/librbd/test_mock_fixture.h | 5 ++++- 10 files changed, 55 insertions(+), 30 deletions(-) diff --git a/src/librbd/AioImageRequest.cc b/src/librbd/AioImageRequest.cc index 1c2a4b140c0f9..807c7e0699a46 100644 --- a/src/librbd/AioImageRequest.cc +++ b/src/librbd/AioImageRequest.cc @@ -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) { diff --git a/src/librbd/Journal.cc b/src/librbd/Journal.cc index 671553f5b830d..f98977bac6dd9 100644 --- a/src/librbd/Journal.cc +++ b/src/librbd/Journal.cc @@ -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::is_journal_replaying() const { m_state == STATE_RESTARTING_REPLAY); } +template +bool Journal::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 void Journal::wait_for_journal_ready(Context *on_ready) { on_ready = create_async_context_callback(m_image_ctx, on_ready); diff --git a/src/librbd/Journal.h b/src/librbd/Journal.h index 496c8819f9636..ba4cfb5d0b152 100644 --- a/src/librbd/Journal.h +++ b/src/librbd/Journal.h @@ -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); diff --git a/src/librbd/operation/Request.cc b/src/librbd/operation/Request.cc index f1ad960d0c444..7534004edc314 100644 --- a/src/librbd/operation/Request.cc +++ b/src/librbd/operation/Request.cc @@ -76,8 +76,8 @@ bool Request::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, &Request::handle_op_event_safe>(this)); return true; @@ -98,8 +98,8 @@ bool Request::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; diff --git a/src/librbd/operation/Request.h b/src/librbd/operation/Request.h index 6a09cb1d63921..78993160bf636 100644 --- a/src/librbd/operation/Request.h +++ b/src/librbd/operation/Request.h @@ -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(request); + if (image_ctx.journal != nullptr) { if (image_ctx.journal->is_journal_replaying()) { + Context *ctx = util::create_context_callback(request); replay_op_ready(ctx); - } else { + return true; + } else if (image_ctx.journal->is_journal_appending()) { + Context *ctx = util::create_context_callback(request); append_op_event(ctx); + return true; } - return true; } return false; } diff --git a/src/test/librbd/mock/MockJournal.h b/src/test/librbd/mock/MockJournal.h index cfcb12c06ec15..18f14218190e1 100644 --- a/src/test/librbd/mock/MockJournal.h +++ b/src/test/librbd/mock/MockJournal.h @@ -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 *)); diff --git a/src/test/librbd/operation/test_mock_ResizeRequest.cc b/src/test/librbd/operation/test_mock_ResizeRequest.cc index d5c1486b9c035..e3a34bec2a653 100644 --- a/src/test/librbd/operation/test_mock_ResizeRequest.cc +++ b/src/test/librbd/operation/test_mock_ResizeRequest.cc @@ -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)); } diff --git a/src/test/librbd/operation/test_mock_SnapshotRollbackRequest.cc b/src/test/librbd/operation/test_mock_SnapshotRollbackRequest.cc index 617333676e6f9..6258229964c44 100644 --- a/src/test/librbd/operation/test_mock_SnapshotRollbackRequest.cc +++ b/src/test/librbd/operation/test_mock_SnapshotRollbackRequest.cc @@ -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); diff --git a/src/test/librbd/test_mock_fixture.cc b/src/test/librbd/test_mock_fixture.cc index c2644eb534773..3fb246d28d37c 100644 --- a/src/test/librbd/test_mock_fixture.cc +++ b/src/test/librbd/test_mock_fixture.cc @@ -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))); diff --git a/src/test/librbd/test_mock_fixture.h b/src/test/librbd/test_mock_fixture.h index bd5a2ac84c686..b06ca5bf7209c 100644 --- a/src/test/librbd/test_mock_fixture.h +++ b/src/test/librbd/test_mock_fixture.h @@ -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: -- 2.39.5