X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=ceph%2Fsrc%2Ftest%2Flibrbd%2Ftest_mock_Journal.cc;fp=ceph%2Fsrc%2Ftest%2Flibrbd%2Ftest_mock_Journal.cc;h=2fe74d2fe4661ae4bb796fafef44798440d4740d;hb=39ae355f72b1d71f2212a99f2bd9f6c1e0d35528;hp=b57c66e8907cdfc43f003f46248cc5c3a814a4d0;hpb=e04241aa9b639588fa6c864845287d2824cb6b55;p=ceph.git diff --git a/ceph/src/test/librbd/test_mock_Journal.cc b/ceph/src/test/librbd/test_mock_Journal.cc index b57c66e89..2fe74d2fe 100644 --- a/ceph/src/test/librbd/test_mock_Journal.cc +++ b/ceph/src/test/librbd/test_mock_Journal.cc @@ -463,6 +463,19 @@ public: return mock_journal->append_write_event(0, length, bl, false); } + uint64_t when_append_compare_and_write_event( + MockJournalImageCtx &mock_image_ctx, MockJournal *mock_journal, + uint64_t length) { + bufferlist cmp_bl; + cmp_bl.append_zero(length); + bufferlist write_bl; + write_bl.append_zero(length); + + std::shared_lock owner_locker{mock_image_ctx.owner_lock}; + return mock_journal->append_compare_and_write_event(0, length, cmp_bl, + write_bl, false); + } + uint64_t when_append_io_event(MockJournalImageCtx &mock_image_ctx, MockJournal *mock_journal, int filter_ret_val) { @@ -1125,6 +1138,51 @@ TEST_F(TestMockJournal, AppendWriteEvent) { expect_shut_down_journaler(mock_journaler); } +TEST_F(TestMockJournal, AppendCompareAndWriteEvent) { + REQUIRE_FEATURE(RBD_FEATURE_JOURNALING); + + librbd::ImageCtx *ictx; + ASSERT_EQ(0, open_image(m_image_name, &ictx)); + + MockJournalImageCtx mock_image_ctx(*ictx); + MockJournal *mock_journal = new MockJournal(mock_image_ctx); + MockObjectDispatch mock_object_dispatch; + ::journal::MockJournaler mock_journaler; + MockJournalOpenRequest mock_open_request; + open_journal(mock_image_ctx, mock_journal, mock_object_dispatch, + mock_journaler, mock_open_request); + BOOST_SCOPE_EXIT_ALL(&) { + close_journal(mock_image_ctx, mock_journal, mock_journaler); + mock_journal->put(); + }; + + InSequence seq; + + ::journal::MockFuture mock_future; + Context *on_journal_safe = nullptr; + expect_append_journaler(mock_journaler); + expect_append_journaler(mock_journaler); + expect_append_journaler(mock_journaler); + expect_wait_future(mock_future, &on_journal_safe); + ASSERT_EQ(1U, when_append_compare_and_write_event(mock_image_ctx, + mock_journal, + 1 << 16)); + mock_journal->get_work_queue()->drain(); + + on_journal_safe->complete(0); + C_SaferCond event_ctx; + mock_journal->wait_event(1U, &event_ctx); + ASSERT_EQ(0, event_ctx.wait()); + + expect_future_committed(mock_journaler); + expect_future_committed(mock_journaler); + expect_future_committed(mock_journaler); + mock_journal->commit_io_event(1U, 0); + ictx->op_work_queue->drain(); + + expect_shut_down_journaler(mock_journaler); +} + TEST_F(TestMockJournal, EventCommitError) { REQUIRE_FEATURE(RBD_FEATURE_JOURNALING);