}
ACTION_P2(NotifyInvoke, lock, cond) {
- Mutex::Locker locker(*lock);
- cond->Signal();
+ std::lock_guard locker{*lock};
+ cond->notify_all();
}
ACTION_P2(CompleteAioCompletion, r, image_ctx) {
- image_ctx->op_work_queue->queue(new FunctionContext([this, arg0](int r) {
+ image_ctx->op_work_queue->queue(new LambdaContext([this, arg0](int r) {
arg0->get();
arg0->init_time(image_ctx, librbd::io::AIO_TYPE_NONE);
arg0->set_request_count(1);
typedef io::ImageRequest<MockReplayImageCtx> MockIoImageRequest;
typedef Replay<MockReplayImageCtx> MockJournalReplay;
- TestMockJournalReplay() : m_invoke_lock("m_invoke_lock") {
- }
+ TestMockJournalReplay() = default;
void expect_accept_ops(MockExclusiveLock &mock_exclusive_lock, bool accept) {
EXPECT_CALL(mock_exclusive_lock, accept_ops()).WillRepeatedly(
}
}
- void expect_writeback_cache_enabled(MockReplayImageCtx &mock_image_ctx,
- bool enabled) {
- EXPECT_CALL(mock_image_ctx, is_writeback_cache_enabled())
- .WillRepeatedly(Return(enabled));
- }
-
void when_process(MockJournalReplay &mock_journal_replay,
EventEntry &&event_entry, Context *on_ready,
Context *on_safe) {
void wait_for_op_invoked(Context **on_finish, int r) {
{
- Mutex::Locker locker(m_invoke_lock);
- while (*on_finish == nullptr) {
- m_invoke_cond.Wait(m_invoke_lock);
- }
+ std::unique_lock locker{m_invoke_lock};
+ m_invoke_cond.wait(locker, [on_finish] { return *on_finish != nullptr; });
}
(*on_finish)->complete(r);
}
return bl;
}
- Mutex m_invoke_lock;
- Cond m_invoke_cond;
+ ceph::mutex m_invoke_lock = ceph::make_mutex("m_invoke_lock");
+ ceph::condition_variable m_invoke_cond;
};
TEST_F(TestMockJournalReplay, AioDiscard) {
MockJournalReplay mock_journal_replay(mock_image_ctx);
MockIoImageRequest mock_io_image_request;
- expect_writeback_cache_enabled(mock_image_ctx, true);
expect_op_work_queue(mock_image_ctx);
InSequence seq;
MockJournalReplay mock_journal_replay(mock_image_ctx);
MockIoImageRequest mock_io_image_request;
- expect_writeback_cache_enabled(mock_image_ctx, true);
expect_op_work_queue(mock_image_ctx);
InSequence seq;
MockJournalReplay mock_journal_replay(mock_image_ctx);
MockIoImageRequest mock_io_image_request;
- expect_writeback_cache_enabled(mock_image_ctx, true);
expect_op_work_queue(mock_image_ctx);
InSequence seq;
MockJournalReplay mock_compare_and_write_journal_replay(mock_image_ctx);
MockJournalReplay mock_mis_compare_and_write_journal_replay(mock_image_ctx);
MockIoImageRequest mock_io_image_request;
- expect_writeback_cache_enabled(mock_image_ctx, true);
expect_op_work_queue(mock_image_ctx);
InSequence seq;
MockJournalReplay mock_journal_replay(mock_image_ctx);
MockIoImageRequest mock_io_image_request;
- expect_writeback_cache_enabled(mock_image_ctx, true);
expect_op_work_queue(mock_image_ctx);
InSequence seq;
MockJournalReplay mock_journal_replay(mock_image_ctx);
MockIoImageRequest mock_io_image_request;
- expect_writeback_cache_enabled(mock_image_ctx, true);
expect_op_work_queue(mock_image_ctx);
InSequence seq;
MockJournalReplay mock_journal_replay(mock_image_ctx);
MockIoImageRequest mock_io_image_request;
- expect_writeback_cache_enabled(mock_image_ctx, true);
expect_op_work_queue(mock_image_ctx);
InSequence seq;
MockJournalReplay mock_journal_replay(mock_image_ctx);
MockIoImageRequest mock_io_image_request;
- expect_writeback_cache_enabled(mock_image_ctx, true);
expect_op_work_queue(mock_image_ctx);
InSequence seq;
"snap")},
&on_snap_remove_ready,
&on_snap_remove_safe);
+ ictx->op_work_queue->drain();
ASSERT_EQ(0, on_snap_remove_ready.wait());
C_SaferCond on_snap_create_ready;
"snap")},
&on_snap_create_ready,
&on_snap_create_safe);
+ ictx->op_work_queue->drain();
C_SaferCond on_shut_down;
mock_journal_replay.shut_down(false, &on_shut_down);
"snap")},
&on_snap_remove_ready,
&on_snap_remove_safe);
+ ictx->op_work_queue->drain();
ASSERT_EQ(0, on_snap_remove_ready.wait());
C_SaferCond on_snap_create_ready;
"snap")},
&on_snap_create_ready,
&on_snap_create_safe);
+ ictx->op_work_queue->drain();
C_SaferCond on_resume;
when_replay_op_ready(mock_journal_replay, 123, &on_resume);
ASSERT_EQ(-ECANCELED, on_finish_safe.wait());
}
-TEST_F(TestMockJournalReplay, WritebackCacheDisabled) {
- REQUIRE_FEATURE(RBD_FEATURE_JOURNALING);
-
- librbd::ImageCtx *ictx;
- ASSERT_EQ(0, open_image(m_image_name, &ictx));
-
- MockReplayImageCtx mock_image_ctx(*ictx);
-
- MockExclusiveLock mock_exclusive_lock;
- mock_image_ctx.exclusive_lock = &mock_exclusive_lock;
- expect_accept_ops(mock_exclusive_lock, true);
-
- MockJournalReplay mock_journal_replay(mock_image_ctx);
- MockIoImageRequest mock_io_image_request;
- expect_writeback_cache_enabled(mock_image_ctx, false);
- expect_op_work_queue(mock_image_ctx);
-
- InSequence seq;
- io::AioCompletion *aio_comp;
- C_SaferCond on_ready;
- C_SaferCond on_safe;
- expect_aio_discard(mock_io_image_request, &aio_comp, 123, 456, 0);
- when_process(mock_journal_replay,
- EventEntry{AioDiscardEvent(123, 456, 0)},
- &on_ready, &on_safe);
-
- when_complete(mock_image_ctx, aio_comp, 0);
- ASSERT_EQ(0, on_ready.wait());
- ASSERT_EQ(0, on_safe.wait());
- ASSERT_EQ(0, when_shut_down(mock_journal_replay, false));
-}
-
} // namespace journal
} // namespace librbd