return ctx.wait();
}
+ int when_shut_down(MockJournalReplay &mock_journal_replay) {
+ C_SaferCond ctx;
+ mock_journal_replay.shut_down(&ctx);
+ return ctx.wait();
+ }
+
void when_replay_op_ready(MockJournalReplay &mock_journal_replay,
uint64_t op_tid, Context *on_resume) {
mock_journal_replay.replay_op_ready(op_tid, on_resume);
ASSERT_EQ(0, on_ready.wait());
expect_aio_flush(mock_image_ctx, mock_aio_image_request, 0);
- ASSERT_EQ(0, when_flush(mock_journal_replay));
+ ASSERT_EQ(0, when_shut_down(mock_journal_replay));
ASSERT_EQ(0, on_safe.wait());
}
ASSERT_EQ(0, on_ready.wait());
expect_aio_flush(mock_image_ctx, mock_aio_image_request, 0);
- ASSERT_EQ(0, when_flush(mock_journal_replay));
+ ASSERT_EQ(0, when_shut_down(mock_journal_replay));
ASSERT_EQ(0, on_safe.wait());
}
when_complete(mock_image_ctx, aio_comp, 0);
ASSERT_EQ(0, on_safe.wait());
- ASSERT_EQ(0, when_flush(mock_journal_replay));
+ ASSERT_EQ(0, when_shut_down(mock_journal_replay));
ASSERT_EQ(0, on_ready.wait());
}
ASSERT_EQ(-EINVAL, on_safe.wait());
expect_aio_flush(mock_image_ctx, mock_aio_image_request, 0);
- ASSERT_EQ(0, when_flush(mock_journal_replay));
+ ASSERT_EQ(0, when_shut_down(mock_journal_replay));
ASSERT_EQ(0, on_ready.wait());
}
ASSERT_EQ(0, on_safe.wait());
}
- ASSERT_EQ(0, when_flush(mock_journal_replay));
+ ASSERT_EQ(0, when_shut_down(mock_journal_replay));
}
TEST_F(TestMockJournalReplay, PauseIO) {
ASSERT_EQ(0, on_safe.wait());
}
+ ASSERT_EQ(0, when_shut_down(mock_journal_replay));
+}
+
+TEST_F(TestMockJournalReplay, Flush) {
+ librbd::ImageCtx *ictx;
+ ASSERT_EQ(0, open_image(m_image_name, &ictx));
+
+ MockImageCtx mock_image_ctx(*ictx);
+ MockJournalReplay mock_journal_replay(mock_image_ctx);
+ MockAioImageRequest mock_aio_image_request;
+ expect_op_work_queue(mock_image_ctx);
+
+ InSequence seq;
+ AioCompletion *aio_comp;
+ C_SaferCond on_ready;
+ C_SaferCond on_safe;
+ expect_aio_discard(mock_aio_image_request, &aio_comp, 123, 456);
+ when_process(mock_journal_replay,
+ EventEntry{AioDiscardEvent(123, 456)},
+ &on_ready, &on_safe);
+
+ when_complete(mock_image_ctx, aio_comp, 0);
+ ASSERT_EQ(0, on_ready.wait());
+
+ expect_aio_flush(mock_image_ctx, mock_aio_image_request, 0);
ASSERT_EQ(0, when_flush(mock_journal_replay));
+ ASSERT_EQ(0, on_safe.wait());
}
TEST_F(TestMockJournalReplay, MissingOpFinishEvent) {
ASSERT_EQ(0, on_ready.wait());
- ASSERT_EQ(0, when_flush(mock_journal_replay));
+ ASSERT_EQ(0, when_shut_down(mock_journal_replay));
ASSERT_EQ(-ERESTART, on_safe.wait());
}
s_instance = this;
}
- MOCK_METHOD1(flush, void(Context *));
+ MOCK_METHOD1(shut_down, void(Context *));
MOCK_METHOD3(process, void(bufferlist::iterator*, Context *, Context *));
MOCK_METHOD2(replay_op_ready, void(uint64_t, Context *));
};
return new Replay();
}
- void flush(Context *on_finish) {
- MockReplay::get_instance().flush(on_finish);
+ void shut_down(Context *on_finish) {
+ MockReplay::get_instance().shut_down(on_finish);
}
void process(bufferlist::iterator *it, Context *on_ready,
EXPECT_CALL(mock_journaler, stop_replay());
}
- void expect_flush_replay(MockImageCtx &mock_image_ctx,
- MockJournalReplay &mock_journal_replay, int r) {
- EXPECT_CALL(mock_journal_replay, flush(_))
+ void expect_shut_down_replay(MockImageCtx &mock_image_ctx,
+ MockJournalReplay &mock_journal_replay, int r) {
+ EXPECT_CALL(mock_journal_replay, shut_down(_))
.WillOnce(Invoke([this, &mock_image_ctx, r](Context *on_flush) {
this->commit_replay(mock_image_ctx, on_flush, r);}));
}
MockJournalReplay mock_journal_replay;
expect_stop_replay(mock_journaler);
- expect_flush_replay(mock_image_ctx, mock_journal_replay, 0);
+ expect_shut_down_replay(mock_image_ctx, mock_journal_replay, 0);
expect_committed(mock_journaler, 0);
expect_start_append(mock_journaler);
ASSERT_EQ(0, when_open(mock_journal));
expect_try_pop_front(mock_journaler, false, mock_replay_entry);
expect_stop_replay(mock_journaler);
- expect_flush_replay(mock_image_ctx, mock_journal_replay, 0);
+ expect_shut_down_replay(mock_image_ctx, mock_journal_replay, 0);
expect_committed(mock_journaler, 3);
expect_start_append(mock_journaler);
MockJournalReplay mock_journal_replay;
expect_stop_replay(mock_journaler);
- expect_flush_replay(mock_image_ctx, mock_journal_replay, 0);
+ expect_shut_down_replay(mock_image_ctx, mock_journal_replay, 0);
// replay failure should result in replay-restart
expect_construct_journaler(mock_journaler);
});
expect_stop_replay(mock_journaler);
- expect_flush_replay(mock_image_ctx, mock_journal_replay, 0);
+ expect_shut_down_replay(mock_image_ctx, mock_journal_replay, 0);
expect_start_append(mock_journaler);
ASSERT_EQ(0, when_open(mock_journal));
expect_replay_process(mock_journal_replay);
expect_try_pop_front(mock_journaler, false, mock_replay_entry);
expect_stop_replay(mock_journaler);
- expect_flush_replay(mock_image_ctx, mock_journal_replay, -EINVAL);
+ expect_shut_down_replay(mock_image_ctx, mock_journal_replay, -EINVAL);
// replay flush failure should result in replay-restart
expect_construct_journaler(mock_journaler);
});
expect_stop_replay(mock_journaler);
- expect_flush_replay(mock_image_ctx, mock_journal_replay, 0);
+ expect_shut_down_replay(mock_image_ctx, mock_journal_replay, 0);
expect_start_append(mock_journaler);
ASSERT_EQ(0, when_open(mock_journal));
MockJournalReplay mock_journal_replay;
expect_stop_replay(mock_journaler);
- expect_flush_replay(mock_image_ctx, mock_journal_replay, 0);
+ expect_shut_down_replay(mock_image_ctx, mock_journal_replay, 0);
expect_start_append(mock_journaler);
ASSERT_EQ(0, when_open(mock_journal));
expect_try_pop_front(mock_journaler, false, mock_replay_entry);
expect_stop_replay(mock_journaler);
- expect_flush_replay(mock_image_ctx, mock_journal_replay, 0);
+ expect_shut_down_replay(mock_image_ctx, mock_journal_replay, 0);
// replay write-to-disk failure should result in replay-restart
expect_construct_journaler(mock_journaler);
});
expect_stop_replay(mock_journaler);
- expect_flush_replay(mock_image_ctx, mock_journal_replay, 0);
+ expect_shut_down_replay(mock_image_ctx, mock_journal_replay, 0);
expect_start_append(mock_journaler);
C_SaferCond ctx;
expect_stop_replay(mock_journaler);
Context *on_flush = nullptr;
- EXPECT_CALL(mock_journal_replay, flush(_))
+ EXPECT_CALL(mock_journal_replay, shut_down(_))
.WillOnce(DoAll(SaveArg<0>(&on_flush),
InvokeWithoutArgs(this, &TestMockJournal::wake_up)));
});
expect_stop_replay(mock_journaler);
- expect_flush_replay(mock_image_ctx, mock_journal_replay, 0);
+ expect_shut_down_replay(mock_image_ctx, mock_journal_replay, 0);
expect_start_append(mock_journaler);
C_SaferCond ctx;