X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=ceph%2Fsrc%2Ftest%2Flibrbd%2Fio%2Ftest_mock_ImageRequest.cc;h=4aca8a8d9ce69c99119fb937355b3e6ff56cea4a;hb=c07f9fc5a4f48397831383549fb0482b93480643;hp=7a11c2c6ab1c63b7eb264575181be705e060bfdb;hpb=9439ae556f035e65c9c107ae13ddd09457dbbecd;p=ceph.git diff --git a/ceph/src/test/librbd/io/test_mock_ImageRequest.cc b/ceph/src/test/librbd/io/test_mock_ImageRequest.cc index 7a11c2c6a..4aca8a8d9 100644 --- a/ceph/src/test/librbd/io/test_mock_ImageRequest.cc +++ b/ceph/src/test/librbd/io/test_mock_ImageRequest.cc @@ -97,6 +97,22 @@ struct ObjectRequest : public ObjectRequestHandle { return s_instance; } + static ObjectRequest* create_compare_and_write(librbd::MockTestImageCtx *ictx, + const std::string &oid, + uint64_t object_no, + uint64_t object_off, + const ceph::bufferlist &cmp_data, + const ceph::bufferlist &write_data, + const ::SnapContext &snapc, + uint64_t *mismatch_offset, + int op_flags, + const ZTracer::Trace &parent_trace, + Context *completion) { + assert(s_instance != nullptr); + s_instance->on_finish = completion; + return s_instance; + } + ObjectRequest() { assert(s_instance == nullptr); s_instance = this; @@ -168,6 +184,7 @@ struct TestMockIoImageRequest : public TestMockFixture { typedef ImageDiscardRequest MockImageDiscardRequest; typedef ImageFlushRequest MockImageFlushRequest; typedef ImageWriteSameRequest MockImageWriteSameRequest; + typedef ImageCompareAndWriteRequest MockImageCompareAndWriteRequest; typedef ObjectRequest MockObjectRequest; typedef ObjectReadRequest MockObjectReadRequest; @@ -334,5 +351,41 @@ TEST_F(TestMockIoImageRequest, AioWriteSameJournalAppendDisabled) { ASSERT_EQ(0, aio_comp_ctx.wait()); } +TEST_F(TestMockIoImageRequest, AioCompareAndWriteJournalAppendDisabled) { + REQUIRE_FEATURE(RBD_FEATURE_JOURNALING); + + librbd::ImageCtx *ictx; + ASSERT_EQ(0, open_image(m_image_name, &ictx)); + + MockObjectRequest mock_aio_object_request; + MockTestImageCtx mock_image_ctx(*ictx); + MockJournal mock_journal; + mock_image_ctx.journal = &mock_journal; + + InSequence seq; + expect_is_journal_appending(mock_journal, false); + expect_object_request_send(mock_image_ctx, mock_aio_object_request, 0); + + C_SaferCond aio_comp_ctx; + AioCompletion *aio_comp = AioCompletion::create_and_start( + &aio_comp_ctx, ictx, AIO_TYPE_COMPARE_AND_WRITE); + + bufferlist cmp_bl; + cmp_bl.append("1"); + bufferlist write_bl; + write_bl.append("1"); + uint64_t mismatch_offset; + MockImageCompareAndWriteRequest mock_aio_image_write(mock_image_ctx, aio_comp, + {{0, 1}}, std::move(cmp_bl), + std::move(write_bl), + &mismatch_offset, + 0, {}); + { + RWLock::RLocker owner_locker(mock_image_ctx.owner_lock); + mock_aio_image_write.send(); + } + ASSERT_EQ(0, aio_comp_ctx.wait()); +} + } // namespace io } // namespace librbd