From: Jason Dillaman Date: Fri, 20 Dec 2019 02:08:48 +0000 (-0500) Subject: rbd-mirror: delay retrieval of remote tag class on bootstrap X-Git-Tag: v15.1.0~352^2~10 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=53455eebdf82c9c82a78d9b8d8238caea2b8796e;p=ceph.git rbd-mirror: delay retrieval of remote tag class on bootstrap This will help move the journal-related bootstrap logic together as a preliminary step for handling snapshot mirroring. Signed-off-by: Jason Dillaman --- diff --git a/src/test/rbd_mirror/image_replayer/test_mock_BootstrapRequest.cc b/src/test/rbd_mirror/image_replayer/test_mock_BootstrapRequest.cc index 5f6bb43a0d18..4a9a1749daa7 100644 --- a/src/test/rbd_mirror/image_replayer/test_mock_BootstrapRequest.cc +++ b/src/test/rbd_mirror/image_replayer/test_mock_BootstrapRequest.cc @@ -503,16 +503,6 @@ TEST_F(TestMockImageReplayerBootstrapRequest, NonPrimaryRemoteSyncingState) { 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); @@ -532,7 +522,9 @@ TEST_F(TestMockImageReplayerBootstrapRequest, NonPrimaryRemoteSyncingState) { 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; @@ -557,16 +549,6 @@ TEST_F(TestMockImageReplayerBootstrapRequest, NonPrimaryRemoteNotTagOwner) { 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); @@ -605,6 +587,7 @@ TEST_F(TestMockImageReplayerBootstrapRequest, NonPrimaryRemoteNotTagOwner) { 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", @@ -619,16 +602,6 @@ TEST_F(TestMockImageReplayerBootstrapRequest, RemoteDemotePromote) { 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); @@ -654,6 +627,16 @@ TEST_F(TestMockImageReplayerBootstrapRequest, RemoteDemotePromote) { 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, @@ -695,16 +678,6 @@ TEST_F(TestMockImageReplayerBootstrapRequest, MultipleRemoteDemotePromotes) { 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); @@ -731,6 +704,16 @@ TEST_F(TestMockImageReplayerBootstrapRequest, MultipleRemoteDemotePromotes) { 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, @@ -781,16 +764,6 @@ TEST_F(TestMockImageReplayerBootstrapRequest, LocalDemoteRemotePromote) { 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); @@ -819,6 +792,16 @@ TEST_F(TestMockImageReplayerBootstrapRequest, LocalDemoteRemotePromote) { 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", @@ -855,16 +838,6 @@ TEST_F(TestMockImageReplayerBootstrapRequest, SplitBrainForcePromote) { 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); @@ -892,6 +865,16 @@ TEST_F(TestMockImageReplayerBootstrapRequest, SplitBrainForcePromote) { 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, @@ -929,16 +912,6 @@ TEST_F(TestMockImageReplayerBootstrapRequest, ResyncRequested) { 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); @@ -976,6 +949,7 @@ TEST_F(TestMockImageReplayerBootstrapRequest, ResyncRequested) { 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", @@ -992,16 +966,6 @@ TEST_F(TestMockImageReplayerBootstrapRequest, PrimaryRemote) { 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); @@ -1024,9 +988,11 @@ TEST_F(TestMockImageReplayerBootstrapRequest, PrimaryRemote) { 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 @@ -1068,16 +1034,6 @@ TEST_F(TestMockImageReplayerBootstrapRequest, PrimaryRemoteLocalDeleted) { 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); @@ -1098,10 +1054,12 @@ TEST_F(TestMockImageReplayerBootstrapRequest, PrimaryRemoteLocalDeleted) { "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); @@ -1119,7 +1077,7 @@ TEST_F(TestMockImageReplayerBootstrapRequest, PrimaryRemoteLocalDeleted) { 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); @@ -1161,16 +1119,6 @@ TEST_F(TestMockImageReplayerBootstrapRequest, LocalImageIdCollision) { 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); @@ -1193,9 +1141,11 @@ TEST_F(TestMockImageReplayerBootstrapRequest, LocalImageIdCollision) { 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 diff --git a/src/tools/rbd_mirror/image_replayer/BootstrapRequest.cc b/src/tools/rbd_mirror/image_replayer/BootstrapRequest.cc index 6b1ea3bcf3f3..98e891433405 100644 --- a/src/tools/rbd_mirror/image_replayer/BootstrapRequest.cc +++ b/src/tools/rbd_mirror/image_replayer/BootstrapRequest.cc @@ -85,7 +85,7 @@ template void BootstrapRequest::send() { *m_do_resync = false; - get_remote_tag_class(); + open_remote_image(); } template @@ -100,53 +100,6 @@ void BootstrapRequest::cancel() { } } -template -void BootstrapRequest::get_remote_tag_class() { - dout(15) << dendl; - - update_progress("GET_REMOTE_TAG_CLASS"); - - Context *ctx = create_context_callback< - BootstrapRequest, &BootstrapRequest::handle_get_remote_tag_class>( - this); - m_journaler->get_client(librbd::Journal<>::IMAGE_CLIENT_ID, &m_client, ctx); -} - -template -void BootstrapRequest::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(&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 void BootstrapRequest::open_remote_image() { dout(15) << "remote_image_id=" << m_remote_image_id << dendl; @@ -378,7 +331,7 @@ void BootstrapRequest::handle_open_local_image(int r) { return; } - get_remote_tags(); + get_remote_tag_class(); } template @@ -534,7 +487,7 @@ void BootstrapRequest::handle_create_local_image(int r) { } template -void BootstrapRequest::get_remote_tags() { +void BootstrapRequest::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 @@ -542,6 +495,56 @@ void BootstrapRequest::get_remote_tags() { return; } + dout(15) << dendl; + + update_progress("GET_REMOTE_TAG_CLASS"); + + Context *ctx = create_context_callback< + BootstrapRequest, &BootstrapRequest::handle_get_remote_tag_class>( + this); + m_journaler->get_client(librbd::Journal<>::IMAGE_CLIENT_ID, &m_client, ctx); +} + +template +void BootstrapRequest::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(&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 +void BootstrapRequest::get_remote_tags() { dout(15) << dendl; update_progress("GET_REMOTE_TAGS"); diff --git a/src/tools/rbd_mirror/image_replayer/BootstrapRequest.h b/src/tools/rbd_mirror/image_replayer/BootstrapRequest.h index 93d9c4c75a89..02c4296753f1 100644 --- a/src/tools/rbd_mirror/image_replayer/BootstrapRequest.h +++ b/src/tools/rbd_mirror/image_replayer/BootstrapRequest.h @@ -96,10 +96,7 @@ private: * * | * v - * GET_REMOTE_TAG_CLASS * * * * * * * * * * * * * * * * * * - * | * (error) - * v * - * OPEN_REMOTE_IMAGE * * * * * * * * * * * * * * * * * * * + * OPEN_REMOTE_IMAGE * * * * * * * * * * * * * * * * * * * (error) * | * * |/--------------------------------------------------*---\ * v * | @@ -125,6 +122,9 @@ private: * | | \-----------------------*---*---/ * | | * * * | v (skip if not needed) * * + * | GET_REMOTE_TAG_CLASS * * * * * * * + * | | * * * + * | v (skip if not needed) * * * * | GET_REMOTE_TAGS * * * * * * * * * * | | * * * * | v (skip if not needed) v * * @@ -182,9 +182,6 @@ private: bufferlist m_out_bl; - void get_remote_tag_class(); - void handle_get_remote_tag_class(int r); - void open_remote_image(); void handle_open_remote_image(int r); @@ -209,6 +206,9 @@ private: void update_client_image(); void handle_update_client_image(int r); + void get_remote_tag_class(); + void handle_get_remote_tag_class(int r); + void get_remote_tags(); void handle_get_remote_tags(int r);