From: Jason Dillaman Date: Mon, 27 Jan 2020 15:57:54 +0000 (-0500) Subject: rbd-mirror: generically track promotion state and primary mirror uuid X-Git-Tag: v15.1.1~472^2~32 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=6e3ca4b923d17722da8f753efeb47c88e30e33fe;p=ceph.git rbd-mirror: generically track promotion state and primary mirror uuid Both journal and snapshot-based mirroring can utilize these two generic states for tracking. Signed-off-by: Jason Dillaman --- diff --git a/src/test/rbd_mirror/image_replayer/test_mock_PrepareLocalImageRequest.cc b/src/test/rbd_mirror/image_replayer/test_mock_PrepareLocalImageRequest.cc index 5f6f6650e845..5d96ad67ce00 100644 --- a/src/test/rbd_mirror/image_replayer/test_mock_PrepareLocalImageRequest.cc +++ b/src/test/rbd_mirror/image_replayer/test_mock_PrepareLocalImageRequest.cc @@ -97,6 +97,10 @@ struct GetMirrorImageIdRequest { template<> struct StateBuilder { virtual ~StateBuilder() {} + + std::string local_image_id; + librbd::mirror::PromotionState local_promotion_state; + std::string local_primary_mirror_uuid; }; GetMirrorImageIdRequest* GetMirrorImageIdRequest::s_instance = nullptr; @@ -108,9 +112,6 @@ struct StateBuilder : public image_replayer::StateBuilder { static StateBuilder* s_instance; - std::string local_image_id; - std::string local_tag_owner; - static StateBuilder* create(const std::string&) { ceph_assert(s_instance != nullptr); return s_instance; @@ -224,8 +225,10 @@ TEST_F(TestMockImageReplayerPrepareLocalImageRequest, Success) { ASSERT_EQ(std::string("local image name"), local_image_name); ASSERT_EQ(std::string("local image id"), mock_journal_state_builder.local_image_id); + ASSERT_EQ(librbd::mirror::PROMOTION_STATE_NON_PRIMARY, + mock_journal_state_builder.local_promotion_state); ASSERT_EQ(std::string("remote mirror uuid"), - mock_journal_state_builder.local_tag_owner); + mock_journal_state_builder.local_primary_mirror_uuid); } TEST_F(TestMockImageReplayerPrepareLocalImageRequest, MirrorImageIdError) { diff --git a/src/tools/rbd_mirror/image_replayer/PrepareLocalImageRequest.cc b/src/tools/rbd_mirror/image_replayer/PrepareLocalImageRequest.cc index dc86cfd20428..e7ee2d0c2a90 100644 --- a/src/tools/rbd_mirror/image_replayer/PrepareLocalImageRequest.cc +++ b/src/tools/rbd_mirror/image_replayer/PrepareLocalImageRequest.cc @@ -126,24 +126,8 @@ void PrepareLocalImageRequest::handle_get_mirror_info(int r) { switch (m_mirror_image.mode) { case cls::rbd::MIRROR_IMAGE_MODE_JOURNAL: - { - // journal-based local image exists - auto state_builder = journal::StateBuilder::create(m_global_image_id); - state_builder->local_image_id = m_local_image_id; - // TODO store promotion state + primary - switch (m_promotion_state) { - case librbd::mirror::PROMOTION_STATE_PRIMARY: - state_builder->local_tag_owner = librbd::Journal<>::LOCAL_MIRROR_UUID; - break; - case librbd::mirror::PROMOTION_STATE_NON_PRIMARY: - state_builder->local_tag_owner = m_primary_mirror_uuid; - break; - case librbd::mirror::PROMOTION_STATE_ORPHAN: - state_builder->local_tag_owner = librbd::Journal<>::ORPHAN_MIRROR_UUID; - break; - } - *m_state_builder = state_builder; - } + // journal-based local image exists + *m_state_builder = journal::StateBuilder::create(m_global_image_id); break; case cls::rbd::MIRROR_IMAGE_MODE_SNAPSHOT: // TODO @@ -154,6 +138,9 @@ void PrepareLocalImageRequest::handle_get_mirror_info(int r) { break; } + (*m_state_builder)->local_image_id = m_local_image_id; + (*m_state_builder)->local_promotion_state = m_promotion_state; + (*m_state_builder)->local_primary_mirror_uuid = m_primary_mirror_uuid; finish(0); } diff --git a/src/tools/rbd_mirror/image_replayer/StateBuilder.cc b/src/tools/rbd_mirror/image_replayer/StateBuilder.cc index 7c45648b87b4..dda6204ed6ad 100644 --- a/src/tools/rbd_mirror/image_replayer/StateBuilder.cc +++ b/src/tools/rbd_mirror/image_replayer/StateBuilder.cc @@ -34,6 +34,19 @@ StateBuilder::~StateBuilder() { ceph_assert(m_sync_point_handler == nullptr); } +template +bool StateBuilder::is_local_primary() const { + return (!local_image_id.empty() && + local_promotion_state == librbd::mirror::PROMOTION_STATE_PRIMARY); +} + +template +bool StateBuilder::is_linked() const { + return (local_promotion_state == + librbd::mirror::PROMOTION_STATE_NON_PRIMARY && + local_primary_mirror_uuid == remote_mirror_uuid); +} + template void StateBuilder::close_local_image(Context* on_finish) { if (local_image_ctx == nullptr) { diff --git a/src/tools/rbd_mirror/image_replayer/StateBuilder.h b/src/tools/rbd_mirror/image_replayer/StateBuilder.h index 22c5ee5c0a5b..ff291617ad84 100644 --- a/src/tools/rbd_mirror/image_replayer/StateBuilder.h +++ b/src/tools/rbd_mirror/image_replayer/StateBuilder.h @@ -41,8 +41,8 @@ public: virtual bool is_disconnected() const = 0; - virtual bool is_local_primary() const = 0; - virtual bool is_linked() const = 0; + bool is_local_primary() const; + virtual bool is_linked() const; virtual cls::rbd::MirrorImageMode get_mirror_image_mode() const = 0; @@ -73,6 +73,9 @@ public: std::string global_image_id; std::string local_image_id; + librbd::mirror::PromotionState local_promotion_state = + librbd::mirror::PROMOTION_STATE_PRIMARY; + std::string local_primary_mirror_uuid; ImageCtxT* local_image_ctx = nullptr; std::string remote_mirror_uuid; diff --git a/src/tools/rbd_mirror/image_replayer/journal/StateBuilder.cc b/src/tools/rbd_mirror/image_replayer/journal/StateBuilder.cc index ed1cf6911ed2..2b7a463671af 100644 --- a/src/tools/rbd_mirror/image_replayer/journal/StateBuilder.cc +++ b/src/tools/rbd_mirror/image_replayer/journal/StateBuilder.cc @@ -54,17 +54,6 @@ bool StateBuilder::is_disconnected() const { return (remote_client_state == cls::journal::CLIENT_STATE_DISCONNECTED); } -template -bool StateBuilder::is_local_primary() const { - return (!this->local_image_id.empty() && - local_tag_owner == librbd::Journal<>::LOCAL_MIRROR_UUID); -} - -template -bool StateBuilder::is_linked() const { - return (local_tag_owner == this->remote_mirror_uuid); -} - template cls::rbd::MirrorImageMode StateBuilder::get_mirror_image_mode() const { return cls::rbd::MIRROR_IMAGE_MODE_JOURNAL; diff --git a/src/tools/rbd_mirror/image_replayer/journal/StateBuilder.h b/src/tools/rbd_mirror/image_replayer/journal/StateBuilder.h index c760a66ce26c..c09f2a7f4fdf 100644 --- a/src/tools/rbd_mirror/image_replayer/journal/StateBuilder.h +++ b/src/tools/rbd_mirror/image_replayer/journal/StateBuilder.h @@ -38,9 +38,6 @@ public: bool is_disconnected() const override; - bool is_local_primary() const override; - bool is_linked() const override; - cls::rbd::MirrorImageMode get_mirror_image_mode() const override; image_sync::SyncPointHandler* create_sync_point_handler() override; @@ -66,8 +63,6 @@ public: const std::string& local_mirror_uuid, ReplayerListener* replayer_listener) override; - std::string local_tag_owner; - Journaler* remote_journaler = nullptr; cls::journal::ClientState remote_client_state = cls::journal::CLIENT_STATE_CONNECTED;