expect_get_or_send_update(mock_replay_status_formatter);
InSequence seq;
- EXPECT_CALL(mock_remote_journaler, construct());
expect_send(mock_prepare_local_image_request, mock_local_image_ctx.id,
"remote mirror uuid", 0);
+ EXPECT_CALL(mock_remote_journaler, construct());
expect_send(mock_bootstrap_request, mock_local_image_ctx, false, 0);
EXPECT_CALL(mock_local_journal, add_listener(_));
create_local_image();
librbd::MockTestImageCtx mock_local_image_ctx(*m_local_image_ctx);
- journal::MockJournaler mock_remote_journaler;
MockPrepareLocalImageRequest mock_prepare_local_image_request;
MockReplayStatusFormatter mock_replay_status_formatter;
expect_get_or_send_update(mock_replay_status_formatter);
InSequence seq;
- EXPECT_CALL(mock_remote_journaler, construct());
expect_send(mock_prepare_local_image_request, mock_local_image_ctx.id,
"", 0);
- EXPECT_CALL(mock_remote_journaler, remove_listener(_));
- expect_shut_down(mock_remote_journaler, 0);
-
C_SaferCond start_ctx;
m_image_replayer->start(&start_ctx);
ASSERT_EQ(0, start_ctx.wait());
expect_get_or_send_update(mock_replay_status_formatter);
InSequence seq;
- EXPECT_CALL(mock_remote_journaler, construct());
expect_send(mock_prepare_local_image_request, "", "", -ENOENT);
+ EXPECT_CALL(mock_remote_journaler, construct());
expect_send(mock_bootstrap_request, mock_local_image_ctx, false, -EREMOTEIO);
EXPECT_CALL(mock_remote_journaler, remove_listener(_));
create_local_image();
librbd::MockTestImageCtx mock_local_image_ctx(*m_local_image_ctx);
- journal::MockJournaler mock_remote_journaler;
MockPrepareLocalImageRequest mock_prepare_local_image_request;
MockReplayStatusFormatter mock_replay_status_formatter;
expect_get_or_send_update(mock_replay_status_formatter);
InSequence seq;
- EXPECT_CALL(mock_remote_journaler, construct());
expect_send(mock_prepare_local_image_request, mock_local_image_ctx.id,
"remote mirror uuid", -EINVAL);
- EXPECT_CALL(mock_remote_journaler, remove_listener(_));
- expect_shut_down(mock_remote_journaler, 0);
-
C_SaferCond start_ctx;
m_image_replayer->start(&start_ctx);
ASSERT_EQ(-EINVAL, start_ctx.wait());
expect_get_or_send_update(mock_replay_status_formatter);
InSequence seq;
- EXPECT_CALL(mock_remote_journaler, construct());
expect_send(mock_prepare_local_image_request, mock_local_image_ctx.id,
"remote mirror uuid", 0);
+ EXPECT_CALL(mock_remote_journaler, construct());
expect_send(mock_bootstrap_request, mock_local_image_ctx, false, -EINVAL);
EXPECT_CALL(mock_remote_journaler, remove_listener(_));
expect_get_or_send_update(mock_replay_status_formatter);
InSequence seq;
- EXPECT_CALL(mock_remote_journaler, construct());
expect_send(mock_prepare_local_image_request, mock_local_image_ctx.id,
"remote mirror uuid", 0);
+ EXPECT_CALL(mock_remote_journaler, construct());
expect_send(mock_bootstrap_request, mock_local_image_ctx, false, 0);
EXPECT_CALL(mock_local_journal, add_listener(_));
expect_get_or_send_update(mock_replay_status_formatter);
InSequence seq;
- EXPECT_CALL(mock_remote_journaler, construct());
expect_send(mock_prepare_local_image_request, mock_local_image_ctx.id,
"remote mirror uuid", 0);
+ EXPECT_CALL(mock_remote_journaler, construct());
expect_send(mock_bootstrap_request, mock_local_image_ctx, false, 0);
EXPECT_CALL(mock_local_journal, add_listener(_));
expect_committed(mock_remote_journaler, 2);
InSequence seq;
- EXPECT_CALL(mock_remote_journaler, construct());
expect_send(mock_prepare_local_image_request, mock_local_image_ctx.id,
"remote mirror uuid", 0);
+ EXPECT_CALL(mock_remote_journaler, construct());
expect_send(mock_bootstrap_request, mock_local_image_ctx, false, 0);
EXPECT_CALL(mock_local_journal, add_listener(_));
expect_get_commit_tid_in_debug(mock_replay_entry);
InSequence seq;
- EXPECT_CALL(mock_remote_journaler, construct());
expect_send(mock_prepare_local_image_request, mock_local_image_ctx.id,
"remote mirror uuid", 0);
+ EXPECT_CALL(mock_remote_journaler, construct());
expect_send(mock_bootstrap_request, mock_local_image_ctx, false, 0);
EXPECT_CALL(mock_local_journal, add_listener(_));
expect_committed(mock_remote_journaler, 1);
InSequence seq;
- EXPECT_CALL(mock_remote_journaler, construct());
expect_send(mock_prepare_local_image_request, mock_local_image_ctx.id,
"remote mirror uuid", 0);
+ EXPECT_CALL(mock_remote_journaler, construct());
expect_send(mock_bootstrap_request, mock_local_image_ctx, false, 0);
EXPECT_CALL(mock_local_journal, add_listener(_));
dout(5) << "stopped manually, ignoring start without manual flag"
<< dendl;
r = -EPERM;
- } else if (m_remote_images.empty()) {
- derr << "no remote images associated with replayer" << dendl;
- r = -EINVAL;
} else {
m_state = STATE_STARTING;
m_last_r = 0;
m_state_desc.clear();
m_manual_stop = false;
- // TODO bootstrap will need to support multiple remote images
- m_remote_image = *m_remote_images.begin();
-
if (on_finish != nullptr) {
assert(m_on_start_finish == nullptr);
m_on_start_finish = on_finish;
return;
}
- CephContext *cct = static_cast<CephContext *>(m_local->cct());
- journal::Settings settings;
- settings.commit_interval = cct->_conf->rbd_mirror_journal_commit_age;
- settings.max_fetch_bytes = cct->_conf->rbd_mirror_journal_max_fetch_bytes;
-
- m_remote_journaler = new Journaler(m_threads->work_queue,
- m_threads->timer,
- &m_threads->timer_lock,
- m_remote_image.io_ctx,
- m_remote_image.image_id,
- m_local_mirror_uuid, settings);
prepare_local_image();
}
void ImageReplayer<I>::bootstrap() {
dout(20) << dendl;
+ if (m_remote_images.empty()) {
+ on_start_fail(0, "waiting for primary remote image");
+ return;
+ }
+
+ // TODO bootstrap will need to support multiple remote images
+ m_remote_image = *m_remote_images.begin();
+
+ CephContext *cct = static_cast<CephContext *>(m_local->cct());
+ journal::Settings settings;
+ settings.commit_interval = cct->_conf->rbd_mirror_journal_commit_age;
+ settings.max_fetch_bytes = cct->_conf->rbd_mirror_journal_max_fetch_bytes;
+
+ m_remote_journaler = new Journaler(m_threads->work_queue,
+ m_threads->timer,
+ &m_threads->timer_lock,
+ m_remote_image.io_ctx,
+ m_remote_image.image_id,
+ m_local_mirror_uuid, settings);
+
Context *ctx = create_context_callback<
ImageReplayer, &ImageReplayer<I>::handle_bootstrap>(this);