InSequence seq;
- // lookup remote image tag class
- cls::journal::Client client;
- librbd::journal::ClientData client_data{
- librbd::journal::ImageClientMeta{123}};
- encode(client_data, client.data);
- ::journal::MockJournaler mock_journaler;
- expect_journaler_get_client(mock_journaler,
- librbd::Journal<>::IMAGE_CLIENT_ID,
- client, 0);
-
// open the remote image
librbd::MockJournal mock_journal;
librbd::MockTestImageCtx mock_remote_image_ctx(*m_remote_image_ctx);
librbd::journal::MirrorPeerClientMeta mirror_peer_client_meta{
mock_local_image_ctx.id};
mirror_peer_client_meta.state = librbd::journal::MIRROR_PEER_STATE_REPLAYING;
+ librbd::journal::ClientData client_data;
client_data.client_meta = mirror_peer_client_meta;
+ ::journal::MockJournaler mock_journaler;
expect_journaler_update_client(mock_journaler, client_data, 0);
MockCloseImageRequest mock_close_image_request;
InSequence seq;
- // lookup remote image tag class
- cls::journal::Client client;
- librbd::journal::ClientData client_data{
- librbd::journal::ImageClientMeta{123}};
- encode(client_data, client.data);
- ::journal::MockJournaler mock_journaler;
- expect_journaler_get_client(mock_journaler,
- librbd::Journal<>::IMAGE_CLIENT_ID,
- client, 0);
-
// open the remote image
librbd::MockJournal mock_journal;
librbd::MockTestImageCtx mock_remote_image_ctx(*m_remote_image_ctx);
librbd::journal::MirrorPeerClientMeta mirror_peer_client_meta{
mock_local_image_ctx.id};
mirror_peer_client_meta.state = librbd::journal::MIRROR_PEER_STATE_REPLAYING;
+ ::journal::MockJournaler mock_journaler;
MockBootstrapRequest *request = create_request(
&mock_threads, &mock_instance_watcher, mock_journaler,
mock_local_image_ctx.id, mock_remote_image_ctx.id, "global image id",
InSequence seq;
- // lookup remote image tag class
- cls::journal::Client client;
- librbd::journal::ClientData client_data{
- librbd::journal::ImageClientMeta{123}};
- encode(client_data, client.data);
- ::journal::MockJournaler mock_journaler;
- expect_journaler_get_client(mock_journaler,
- librbd::Journal<>::IMAGE_CLIENT_ID,
- client, 0);
-
// open the remote image
librbd::MockJournal mock_journal;
librbd::MockTestImageCtx mock_remote_image_ctx(*m_remote_image_ctx);
expect_journal_get_tag_tid(mock_journal, 345);
expect_journal_get_tag_data(mock_journal, {"remote mirror uuid"});
+ // lookup remote image tag class
+ cls::journal::Client client;
+ librbd::journal::ClientData client_data{
+ librbd::journal::ImageClientMeta{123}};
+ encode(client_data, client.data);
+ ::journal::MockJournaler mock_journaler;
+ expect_journaler_get_client(mock_journaler,
+ librbd::Journal<>::IMAGE_CLIENT_ID,
+ client, 0);
+
// remote demotion / promotion event
Tags tags = {
{2, 123, encode_tag_data({librbd::Journal<>::LOCAL_MIRROR_UUID,
InSequence seq;
- // lookup remote image tag class
- cls::journal::Client client;
- librbd::journal::ClientData client_data{
- librbd::journal::ImageClientMeta{123}};
- encode(client_data, client.data);
- ::journal::MockJournaler mock_journaler;
- expect_journaler_get_client(mock_journaler,
- librbd::Journal<>::IMAGE_CLIENT_ID,
- client, 0);
-
// open the remote image
librbd::MockJournal mock_journal;
librbd::MockTestImageCtx mock_remote_image_ctx(*m_remote_image_ctx);
expect_journal_get_tag_data(mock_journal, {librbd::Journal<>::ORPHAN_MIRROR_UUID,
"remote mirror uuid", true, 4, 1});
+ // lookup remote image tag class
+ cls::journal::Client client;
+ librbd::journal::ClientData client_data{
+ librbd::journal::ImageClientMeta{123}};
+ encode(client_data, client.data);
+ ::journal::MockJournaler mock_journaler;
+ expect_journaler_get_client(mock_journaler,
+ librbd::Journal<>::IMAGE_CLIENT_ID,
+ client, 0);
+
// remote demotion / promotion event
Tags tags = {
{2, 123, encode_tag_data({librbd::Journal<>::LOCAL_MIRROR_UUID,
InSequence seq;
- // lookup remote image tag class
- cls::journal::Client client;
- librbd::journal::ClientData client_data{
- librbd::journal::ImageClientMeta{123}};
- encode(client_data, client.data);
- ::journal::MockJournaler mock_journaler;
- expect_journaler_get_client(mock_journaler,
- librbd::Journal<>::IMAGE_CLIENT_ID,
- client, 0);
-
// open the remote image
librbd::MockJournal mock_journal;
librbd::MockTestImageCtx mock_remote_image_ctx(*m_remote_image_ctx);
librbd::Journal<>::LOCAL_MIRROR_UUID,
true, 345, 1});
+ // lookup remote image tag class
+ cls::journal::Client client;
+ librbd::journal::ClientData client_data{
+ librbd::journal::ImageClientMeta{123}};
+ encode(client_data, client.data);
+ ::journal::MockJournaler mock_journaler;
+ expect_journaler_get_client(mock_journaler,
+ librbd::Journal<>::IMAGE_CLIENT_ID,
+ client, 0);
+
// remote demotion / promotion event
Tags tags = {
{2, 123, encode_tag_data({"local mirror uuid", "local mirror uuid",
InSequence seq;
- // lookup remote image tag class
- cls::journal::Client client;
- librbd::journal::ClientData client_data{
- librbd::journal::ImageClientMeta{123}};
- encode(client_data, client.data);
- ::journal::MockJournaler mock_journaler;
- expect_journaler_get_client(mock_journaler,
- librbd::Journal<>::IMAGE_CLIENT_ID,
- client, 0);
-
// open the remote image
librbd::MockJournal mock_journal;
librbd::MockTestImageCtx mock_remote_image_ctx(*m_remote_image_ctx);
librbd::Journal<>::ORPHAN_MIRROR_UUID,
true, 344, 0});
+ // lookup remote image tag class
+ cls::journal::Client client;
+ librbd::journal::ClientData client_data{
+ librbd::journal::ImageClientMeta{123}};
+ encode(client_data, client.data);
+ ::journal::MockJournaler mock_journaler;
+ expect_journaler_get_client(mock_journaler,
+ librbd::Journal<>::IMAGE_CLIENT_ID,
+ client, 0);
+
// remote demotion / promotion event
Tags tags = {
{2, 123, encode_tag_data({librbd::Journal<>::LOCAL_MIRROR_UUID,
InSequence seq;
- // lookup remote image tag class
- cls::journal::Client client;
- librbd::journal::ClientData client_data{
- librbd::journal::ImageClientMeta{123}};
- encode(client_data, client.data);
- ::journal::MockJournaler mock_journaler;
- expect_journaler_get_client(mock_journaler,
- librbd::Journal<>::IMAGE_CLIENT_ID,
- client, 0);
-
// open the remote image
librbd::MockJournal mock_journal;
librbd::MockTestImageCtx mock_remote_image_ctx(*m_remote_image_ctx);
librbd::journal::MirrorPeerClientMeta mirror_peer_client_meta{
mock_local_image_ctx.id};
mirror_peer_client_meta.state = librbd::journal::MIRROR_PEER_STATE_REPLAYING;
+ ::journal::MockJournaler mock_journaler;
MockBootstrapRequest *request = create_request(
&mock_threads, &mock_instance_watcher, mock_journaler,
mock_local_image_ctx.id, mock_remote_image_ctx.id, "global image id",
InSequence seq;
- // lookup remote image tag class
- cls::journal::Client client;
- librbd::journal::ClientData client_data{
- librbd::journal::ImageClientMeta{123}};
- encode(client_data, client.data);
- ::journal::MockJournaler mock_journaler;
- expect_journaler_get_client(mock_journaler,
- librbd::Journal<>::IMAGE_CLIENT_ID,
- client, 0);
-
// open the remote image
librbd::MockJournal mock_journal;
librbd::MockTestImageCtx mock_remote_image_ctx(*m_remote_image_ctx);
librbd::journal::MirrorPeerClientMeta mirror_peer_client_meta;
mirror_peer_client_meta.image_id = mock_local_image_ctx.id;
mirror_peer_client_meta.state = librbd::journal::MIRROR_PEER_STATE_SYNCING;
+ librbd::journal::ClientData client_data;
client_data.client_meta = mirror_peer_client_meta;
- client.data.clear();
+ cls::journal::Client client;
encode(client_data, client.data);
+ ::journal::MockJournaler mock_journaler;
expect_journaler_update_client(mock_journaler, client_data, 0);
// create the local image
InSequence seq;
- // lookup remote image tag class
- cls::journal::Client client;
- librbd::journal::ClientData client_data{
- librbd::journal::ImageClientMeta{123}};
- encode(client_data, client.data);
- ::journal::MockJournaler mock_journaler;
- expect_journaler_get_client(mock_journaler,
- librbd::Journal<>::IMAGE_CLIENT_ID,
- client, 0);
-
// open the remote image
librbd::MockJournal mock_journal;
librbd::MockTestImageCtx mock_remote_image_ctx(*m_remote_image_ctx);
"missing image id", nullptr, -ENOENT);
// re-register the client
+ ::journal::MockJournaler mock_journaler;
expect_journaler_unregister_client(mock_journaler, 0);
librbd::journal::MirrorPeerClientMeta mirror_peer_client_meta;
mirror_peer_client_meta.image_id = "";
mirror_peer_client_meta.state = librbd::journal::MIRROR_PEER_STATE_REPLAYING;
+ librbd::journal::ClientData client_data;
client_data.client_meta = mirror_peer_client_meta;
expect_journaler_register_client(mock_journaler, client_data, 0);
mirror_peer_client_meta.image_id = mock_local_image_ctx.id;
mirror_peer_client_meta.state = librbd::journal::MIRROR_PEER_STATE_SYNCING;
client_data.client_meta = mirror_peer_client_meta;
- client.data.clear();
+ cls::journal::Client client;
encode(client_data, client.data);
expect_journaler_update_client(mock_journaler, client_data, 0);
InSequence seq;
- // lookup remote image tag class
- cls::journal::Client client;
- librbd::journal::ClientData client_data{
- librbd::journal::ImageClientMeta{123}};
- encode(client_data, client.data);
- ::journal::MockJournaler mock_journaler;
- expect_journaler_get_client(mock_journaler,
- librbd::Journal<>::IMAGE_CLIENT_ID,
- client, 0);
-
// open the remote image
librbd::MockJournal mock_journal;
librbd::MockTestImageCtx mock_remote_image_ctx(*m_remote_image_ctx);
librbd::journal::MirrorPeerClientMeta mirror_peer_client_meta;
mirror_peer_client_meta.image_id = mock_local_image_ctx.id;
mirror_peer_client_meta.state = librbd::journal::MIRROR_PEER_STATE_SYNCING;
+ librbd::journal::ClientData client_data;
client_data.client_meta = mirror_peer_client_meta;
- client.data.clear();
+ cls::journal::Client client;
encode(client_data, client.data);
+ ::journal::MockJournaler mock_journaler;
expect_journaler_update_client(mock_journaler, client_data, 0);
// create the local image
void BootstrapRequest<I>::send() {
*m_do_resync = false;
- get_remote_tag_class();
+ open_remote_image();
}
template <typename I>
}
}
-template <typename I>
-void BootstrapRequest<I>::get_remote_tag_class() {
- dout(15) << dendl;
-
- update_progress("GET_REMOTE_TAG_CLASS");
-
- Context *ctx = create_context_callback<
- BootstrapRequest<I>, &BootstrapRequest<I>::handle_get_remote_tag_class>(
- this);
- m_journaler->get_client(librbd::Journal<>::IMAGE_CLIENT_ID, &m_client, ctx);
-}
-
-template <typename I>
-void BootstrapRequest<I>::handle_get_remote_tag_class(int r) {
- dout(15) << "r=" << r << dendl;
-
- if (r < 0) {
- derr << "failed to retrieve remote client: " << cpp_strerror(r) << dendl;
- finish(r);
- return;
- }
-
- librbd::journal::ClientData client_data;
- auto it = m_client.data.cbegin();
- try {
- decode(client_data, it);
- } catch (const buffer::error &err) {
- derr << "failed to decode remote client meta data: " << err.what()
- << dendl;
- finish(-EBADMSG);
- return;
- }
-
- librbd::journal::ImageClientMeta *client_meta =
- boost::get<librbd::journal::ImageClientMeta>(&client_data.client_meta);
- if (client_meta == nullptr) {
- derr << "unknown remote client registration" << dendl;
- finish(-EINVAL);
- return;
- }
-
- m_remote_tag_class = client_meta->tag_class;
- dout(10) << "remote tag class=" << m_remote_tag_class << dendl;
-
- open_remote_image();
-}
-
template <typename I>
void BootstrapRequest<I>::open_remote_image() {
dout(15) << "remote_image_id=" << m_remote_image_id << dendl;
return;
}
- get_remote_tags();
+ get_remote_tag_class();
}
template <typename I>
}
template <typename I>
-void BootstrapRequest<I>::get_remote_tags() {
+void BootstrapRequest<I>::get_remote_tag_class() {
if (m_client_meta->state == librbd::journal::MIRROR_PEER_STATE_SYNCING) {
// optimization -- no need to compare remote tags if we just created
// the image locally or sync was interrupted
return;
}
+ dout(15) << dendl;
+
+ update_progress("GET_REMOTE_TAG_CLASS");
+
+ Context *ctx = create_context_callback<
+ BootstrapRequest<I>, &BootstrapRequest<I>::handle_get_remote_tag_class>(
+ this);
+ m_journaler->get_client(librbd::Journal<>::IMAGE_CLIENT_ID, &m_client, ctx);
+}
+
+template <typename I>
+void BootstrapRequest<I>::handle_get_remote_tag_class(int r) {
+ dout(15) << "r=" << r << dendl;
+
+ if (r < 0) {
+ derr << "failed to retrieve remote client: " << cpp_strerror(r) << dendl;
+ m_ret_val = r;
+ close_local_image();
+ return;
+ }
+
+ librbd::journal::ClientData client_data;
+ auto it = m_client.data.cbegin();
+ try {
+ decode(client_data, it);
+ } catch (const buffer::error &err) {
+ derr << "failed to decode remote client meta data: " << err.what()
+ << dendl;
+ m_ret_val = -EBADMSG;
+ close_local_image();
+ return;
+ }
+
+ librbd::journal::ImageClientMeta *client_meta =
+ boost::get<librbd::journal::ImageClientMeta>(&client_data.client_meta);
+ if (client_meta == nullptr) {
+ derr << "unknown remote client registration" << dendl;
+ m_ret_val = -EINVAL;
+ close_local_image();
+ return;
+ }
+
+ m_remote_tag_class = client_meta->tag_class;
+ dout(10) << "remote tag class=" << m_remote_tag_class << dendl;
+
+ get_remote_tags();
+}
+
+template <typename I>
+void BootstrapRequest<I>::get_remote_tags() {
dout(15) << dendl;
update_progress("GET_REMOTE_TAGS");