return 0;
}
+ void expect_local_journal_add_listener(
+ librbd::MockTestJournal& mock_local_journal,
+ librbd::journal::Listener** local_journal_listener) {
+ EXPECT_CALL(mock_local_journal, add_listener(_))
+ .WillOnce(SaveArg<0>(local_journal_listener));
+ expect_is_tag_owner(mock_local_journal, false);
+ expect_is_resync_requested(mock_local_journal, 0, false);
+ }
+
int init_entry_replayer(MockReplayer& mock_replayer,
MockThreads& mock_threads,
MockReplayerListener& mock_replayer_listener,
{librbd::journal::MirrorPeerClientMeta{}}, 0);
expect_start_external_replay(mock_local_journal, &mock_local_journal_replay,
0);
- EXPECT_CALL(mock_local_journal, add_listener(_))
- .WillOnce(SaveArg<0>(local_journal_listener));
- expect_is_tag_owner(mock_local_journal, false);
- expect_is_resync_requested(mock_local_journal, 0, false);
+ expect_local_journal_add_listener(mock_local_journal,
+ local_journal_listener);
EXPECT_CALL(mock_remote_journaler, start_live_replay(_, _))
.WillOnce(SaveArg<0>(remote_replay_handler));
expect_notification(mock_threads, mock_replayer_listener);
mock_local_journal_replay));
}
-TEST_F(TestMockImageReplayerJournalReplayer, InitNoLocalJournal) {
+TEST_F(TestMockImageReplayerJournalReplayer, InitRemoteJournalerError) {
librbd::MockTestJournal mock_local_journal;
librbd::MockTestImageCtx mock_local_image_ctx{*m_local_image_ctx,
mock_local_journal};
::journal::MockJournaler mock_remote_journaler;
MockReplayerListener mock_replayer_listener;
MockThreads mock_threads{m_threads};
-
- mock_local_image_ctx.journal = nullptr;
MockStateBuilder mock_state_builder(mock_local_image_ctx,
mock_remote_journaler,
{});
InSequence seq;
+ expect_init(mock_remote_journaler, -EINVAL);
MockCloseImageRequest mock_close_image_request;
expect_send(mock_close_image_request, 0);
ASSERT_EQ(-EINVAL, init_ctx.wait());
}
-TEST_F(TestMockImageReplayerJournalReplayer, InitRemoteJournalerError) {
+TEST_F(TestMockImageReplayerJournalReplayer, InitRemoteJournalerGetClientError) {
librbd::MockTestJournal mock_local_journal;
librbd::MockTestImageCtx mock_local_image_ctx{*m_local_image_ctx,
mock_local_journal};
InSequence seq;
- expect_init(mock_remote_journaler, -EINVAL);
+ expect_init(mock_remote_journaler, 0);
+ EXPECT_CALL(mock_remote_journaler, add_listener(_));
+ expect_get_cached_client(mock_remote_journaler, "local mirror uuid", {},
+ {librbd::journal::MirrorPeerClientMeta{}}, -EINVAL);
MockCloseImageRequest mock_close_image_request;
expect_send(mock_close_image_request, 0);
+ EXPECT_CALL(mock_remote_journaler, remove_listener(_));
C_SaferCond init_ctx;
mock_replayer.init(&init_ctx);
ASSERT_EQ(-EINVAL, init_ctx.wait());
}
-TEST_F(TestMockImageReplayerJournalReplayer, InitRemoteJournalerGetClientError) {
+TEST_F(TestMockImageReplayerJournalReplayer, InitNoLocalJournal) {
librbd::MockTestJournal mock_local_journal;
librbd::MockTestImageCtx mock_local_image_ctx{*m_local_image_ctx,
mock_local_journal};
::journal::MockJournaler mock_remote_journaler;
MockReplayerListener mock_replayer_listener;
MockThreads mock_threads{m_threads};
+
+ mock_local_image_ctx.journal = nullptr;
MockStateBuilder mock_state_builder(mock_local_image_ctx,
mock_remote_journaler,
{});
expect_work_queue_repeatedly(mock_threads);
InSequence seq;
-
expect_init(mock_remote_journaler, 0);
EXPECT_CALL(mock_remote_journaler, add_listener(_));
expect_get_cached_client(mock_remote_journaler, "local mirror uuid", {},
- {librbd::journal::MirrorPeerClientMeta{}}, -EINVAL);
+ {librbd::journal::MirrorPeerClientMeta{}}, 0);
+
MockCloseImageRequest mock_close_image_request;
expect_send(mock_close_image_request, 0);
EXPECT_CALL(mock_remote_journaler, remove_listener(_));
// replay_flush
expect_shut_down(mock_local_journal_replay, false, 0);
+ EXPECT_CALL(mock_local_journal, remove_listener(_));
EXPECT_CALL(mock_local_journal, stop_external_replay());
expect_start_external_replay(mock_local_journal, &mock_local_journal_replay,
0);
+ expect_local_journal_add_listener(mock_local_journal,
+ &local_journal_listener);
expect_get_tag(mock_remote_journaler, tag, 0);
expect_allocate_tag(mock_local_journal, 0);
EXPECT_CALL(mock_local_journal_replay, decode(_, _)).WillOnce(Return(0));
expect_preprocess(mock_event_preprocessor, false, 0);
expect_process(mock_local_journal_replay, 0, 0);
+ EXPECT_CALL(mock_replay_status_formatter, handle_entry_processed(_));
// the next event with preprocess
expect_try_pop_front(mock_remote_journaler, tag.tid, true);
EXPECT_CALL(mock_local_journal_replay, decode(_, _)).WillOnce(Return(0));
expect_preprocess(mock_event_preprocessor, true, 0);
expect_process(mock_local_journal_replay, 0, 0);
+ EXPECT_CALL(mock_replay_status_formatter, handle_entry_processed(_));
// attempt to process the next event
C_SaferCond replay_ctx;
// replay_flush
expect_shut_down(mock_local_journal_replay, false, 0);
+ EXPECT_CALL(mock_local_journal, remove_listener(_));
EXPECT_CALL(mock_local_journal, stop_external_replay());
expect_start_external_replay(mock_local_journal, &mock_local_journal_replay,
0);
+ expect_local_journal_add_listener(mock_local_journal,
+ &local_journal_listener);
expect_get_tag(mock_remote_journaler, tag, 0);
expect_allocate_tag(mock_local_journal, 0);
// replay_flush
expect_shut_down(mock_local_journal_replay, false, 0);
+ EXPECT_CALL(mock_local_journal, remove_listener(_));
EXPECT_CALL(mock_local_journal, stop_external_replay());
expect_start_external_replay(mock_local_journal, &mock_local_journal_replay,
0);
+ expect_local_journal_add_listener(mock_local_journal,
+ &local_journal_listener);
expect_get_tag(mock_remote_journaler, tag, 0);
expect_allocate_tag(mock_local_journal, 0);
ReturnArg<1>()));
expect_preprocess(mock_event_preprocessor, false, 0);
expect_process(mock_local_journal_replay, 0, 0);
+ EXPECT_CALL(mock_replay_status_formatter, handle_entry_processed(_));
// attempt to process the next event
C_SaferCond replay_ctx;
expect_try_pop_front(mock_remote_journaler, 1, true);
expect_shut_down(mock_local_journal_replay, false, -EINVAL);
+ EXPECT_CALL(mock_local_journal, remove_listener(_));
EXPECT_CALL(mock_local_journal, stop_external_replay());
expect_notification(mock_threads, mock_replayer_listener);
remote_replay_handler->handle_entries_available();
wait_for_notification();
ASSERT_EQ(-EINVAL, mock_replayer.get_error_code());
- EXPECT_CALL(mock_local_journal, remove_listener(_));
MockCloseImageRequest mock_close_image_request;
expect_send(mock_close_image_request, 0);
expect_stop_replay(mock_remote_journaler, 0);
expect_try_pop_front(mock_remote_journaler, 1, true);
expect_shut_down(mock_local_journal_replay, false, 0);
+ EXPECT_CALL(mock_local_journal, remove_listener(_));
EXPECT_CALL(mock_local_journal, stop_external_replay());
expect_start_external_replay(mock_local_journal, nullptr, -EINVAL);
expect_notification(mock_threads, mock_replayer_listener);
wait_for_notification();
ASSERT_EQ(-EINVAL, mock_replayer.get_error_code());
- EXPECT_CALL(mock_local_journal, remove_listener(_));
MockCloseImageRequest mock_close_image_request;
expect_send(mock_close_image_request, 0);
expect_stop_replay(mock_remote_journaler, 0);
true, 0, 0})};
expect_try_pop_front(mock_remote_journaler, tag.tid, true);
expect_shut_down(mock_local_journal_replay, false, 0);
+ EXPECT_CALL(mock_local_journal, remove_listener(_));
EXPECT_CALL(mock_local_journal, stop_external_replay());
expect_start_external_replay(mock_local_journal, &mock_local_journal_replay,
0);
+ expect_local_journal_add_listener(mock_local_journal,
+ &local_journal_listener);
expect_get_tag(mock_remote_journaler, tag, -EINVAL);
expect_notification(mock_threads, mock_replayer_listener);
remote_replay_handler->handle_entries_available();
expect_try_pop_front(mock_remote_journaler, tag.tid, true);
expect_shut_down(mock_local_journal_replay, false, 0);
+ EXPECT_CALL(mock_local_journal, remove_listener(_));
EXPECT_CALL(mock_local_journal, stop_external_replay());
expect_start_external_replay(mock_local_journal, &mock_local_journal_replay,
0);
+ expect_local_journal_add_listener(mock_local_journal,
+ &local_journal_listener);
expect_get_tag(mock_remote_journaler, tag, 0);
expect_get_tag_data(mock_local_journal, {});
expect_allocate_tag(mock_local_journal, 0);
EXPECT_CALL(mock_local_journal_replay, decode(_, _)).WillOnce(Return(0));
expect_preprocess(mock_event_preprocessor, false, 0);
expect_process(mock_local_journal_replay, 0, 0);
+ EXPECT_CALL(mock_replay_status_formatter, handle_entry_processed(_));
remote_replay_handler->handle_entries_available();
wait_for_notification();
expect_try_pop_front(mock_remote_journaler, tag.tid, true);
expect_shut_down(mock_local_journal_replay, false, 0);
+ EXPECT_CALL(mock_local_journal, remove_listener(_));
EXPECT_CALL(mock_local_journal, stop_external_replay());
expect_start_external_replay(mock_local_journal, &mock_local_journal_replay,
0);
+ expect_local_journal_add_listener(mock_local_journal,
+ &local_journal_listener);
expect_get_tag(mock_remote_journaler, tag, 0);
expect_allocate_tag(mock_local_journal, -EINVAL);
expect_notification(mock_threads, mock_replayer_listener);
expect_try_pop_front(mock_remote_journaler, tag.tid, true);
expect_shut_down(mock_local_journal_replay, false, 0);
+ EXPECT_CALL(mock_local_journal, remove_listener(_));
EXPECT_CALL(mock_local_journal, stop_external_replay());
expect_start_external_replay(mock_local_journal, &mock_local_journal_replay,
0);
+ expect_local_journal_add_listener(mock_local_journal,
+ &local_journal_listener);
expect_get_tag(mock_remote_journaler, tag, 0);
expect_allocate_tag(mock_local_journal, 0);
EXPECT_CALL(mock_replay_entry, get_data());
expect_try_pop_front(mock_remote_journaler, tag.tid, true);
expect_shut_down(mock_local_journal_replay, false, 0);
+ EXPECT_CALL(mock_local_journal, remove_listener(_));
EXPECT_CALL(mock_local_journal, stop_external_replay());
expect_start_external_replay(mock_local_journal, &mock_local_journal_replay,
0);
+ expect_local_journal_add_listener(mock_local_journal,
+ &local_journal_listener);
expect_get_tag(mock_remote_journaler, tag, 0);
expect_allocate_tag(mock_local_journal, 0);
EXPECT_CALL(mock_replay_entry, get_data());
EXPECT_CALL(mock_local_journal_replay, decode(_, _)).WillOnce(Return(0));
expect_preprocess(mock_event_preprocessor, false, 0);
expect_process(mock_local_journal_replay, 0, -EINVAL);
+ EXPECT_CALL(mock_replay_status_formatter, handle_entry_processed(_));
// attempt to process the next event
C_SaferCond replay_ctx;
expect_try_pop_front(mock_remote_journaler, tag.tid, true);
expect_shut_down(mock_local_journal_replay, false, 0);
+ EXPECT_CALL(mock_local_journal, remove_listener(_));
EXPECT_CALL(mock_local_journal, stop_external_replay());
expect_start_external_replay(mock_local_journal, &mock_local_journal_replay,
0);
+ expect_local_journal_add_listener(mock_local_journal,
+ &local_journal_listener);
expect_get_tag(mock_remote_journaler, tag, 0);
expect_allocate_tag(mock_local_journal, 0);
EXPECT_CALL(mock_local_journal_replay, decode(_, _)).WillOnce(Return(0));
expect_preprocess(mock_event_preprocessor, false, 0);
expect_process(mock_local_journal_replay, 0, 0);
+ EXPECT_CALL(mock_replay_status_formatter, handle_entry_processed(_));
// attempt to process the next event
C_SaferCond replay_ctx;