diff --git a/src/librbd/AioImageRequest.cc b/src/librbd/AioImageRequest.cc index dd1e26aa49fe2..010283ff4016c 100644 --- a/src/librbd/AioImageRequest.cc +++ b/src/librbd/AioImageRequest.cc @@ -563,6 +563,8 @@ void AioImageDiscard::update_stats(size_t length) { template void AioImageFlush::send_request() { I &image_ctx = this->m_image_ctx; + image_ctx.user_flushed(); + bool journaling = false; { RWLock::RLocker snap_locker(image_ctx.snap_lock); diff --git a/src/test/librbd/journal/test_Replay.cc b/src/test/librbd/journal/test_Replay.cc index 819b456cbd277..054d1fb66bfc3 100644 --- a/src/test/librbd/journal/test_Replay.cc +++ b/src/test/librbd/journal/test_Replay.cc @@ -687,6 +687,12 @@ TEST_F(TestJournalReplay, ObjectPosition) { ASSERT_EQ(0, aio_comp->wait_for_complete()); aio_comp->release(); + { + // user flush requests are ignored when journaling + cache are enabled + RWLock::RLocker owner_lock(ictx->owner_lock); + ictx->flush(); + } + // check the commit position updated get_journal_commit_position(ictx, ¤t_tag, ¤t_entry); ASSERT_EQ(initial_tag + 1, current_tag); diff --git a/src/test/librbd/mock/MockImageCtx.h b/src/test/librbd/mock/MockImageCtx.h index 428d1b9d5976a..bf1ee539e0972 100644 --- a/src/test/librbd/mock/MockImageCtx.h +++ b/src/test/librbd/mock/MockImageCtx.h @@ -148,6 +148,7 @@ struct MockImageCtx { uint8_t protection_status, uint64_t flags)); MOCK_METHOD2(rm_snap, void(std::string in_snap_name, librados::snap_t id)); + MOCK_METHOD0(user_flushed, void()); MOCK_METHOD1(flush, void(Context *)); MOCK_METHOD1(flush_async_operations, void(Context *)); MOCK_METHOD1(flush_copyup, void(Context *)); diff --git a/src/test/librbd/test_mock_AioImageRequest.cc b/src/test/librbd/test_mock_AioImageRequest.cc index 2cd6b162a4408..dd64b5f28a886 100644 --- a/src/test/librbd/test_mock_AioImageRequest.cc +++ b/src/test/librbd/test_mock_AioImageRequest.cc @@ -169,6 +169,10 @@ struct TestMockAioImageRequest : public TestMockFixture { })); } + void expect_user_flushed(MockImageCtx &mock_image_ctx) { + EXPECT_CALL(mock_image_ctx, user_flushed()); + } + void expect_flush(MockImageCtx &mock_image_ctx, int r) { EXPECT_CALL(mock_image_ctx, flush(_)) .WillOnce(CompleteContext(r, mock_image_ctx.image_ctx->op_work_queue)); @@ -240,6 +244,7 @@ TEST_F(TestMockAioImageRequest, AioFlushJournalAppendDisabled) { mock_image_ctx.journal = &mock_journal; InSequence seq; + expect_user_flushed(mock_image_ctx); expect_is_journal_appending(mock_journal, false); expect_flush(mock_image_ctx, 0);