]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rbd-mirror: generically track promotion state and primary mirror uuid
authorJason Dillaman <dillaman@redhat.com>
Mon, 27 Jan 2020 15:57:54 +0000 (10:57 -0500)
committerJason Dillaman <dillaman@redhat.com>
Thu, 30 Jan 2020 15:26:36 +0000 (10:26 -0500)
Both journal and snapshot-based mirroring can utilize these two generic
states for tracking.

Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/test/rbd_mirror/image_replayer/test_mock_PrepareLocalImageRequest.cc
src/tools/rbd_mirror/image_replayer/PrepareLocalImageRequest.cc
src/tools/rbd_mirror/image_replayer/StateBuilder.cc
src/tools/rbd_mirror/image_replayer/StateBuilder.h
src/tools/rbd_mirror/image_replayer/journal/StateBuilder.cc
src/tools/rbd_mirror/image_replayer/journal/StateBuilder.h

index 5f6f6650e8458f8767570f0efccd96e4e4ca9544..5d96ad67ce00ae62f8cd8ae9a2f9c563ff5a9dca 100644 (file)
@@ -97,6 +97,10 @@ struct GetMirrorImageIdRequest<librbd::MockTestImageCtx> {
 template<>
 struct StateBuilder<librbd::MockTestImageCtx> {
   virtual ~StateBuilder() {}
+
+  std::string local_image_id;
+  librbd::mirror::PromotionState local_promotion_state;
+  std::string local_primary_mirror_uuid;
 };
 
 GetMirrorImageIdRequest<librbd::MockTestImageCtx>* GetMirrorImageIdRequest<librbd::MockTestImageCtx>::s_instance = nullptr;
@@ -108,9 +112,6 @@ struct StateBuilder<librbd::MockTestImageCtx>
   : public image_replayer::StateBuilder<librbd::MockTestImageCtx> {
   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) {
index dc86cfd20428ea31d23640251c92ac21ee3036b7..e7ee2d0c2a9000d7a00d8e4b597a6cebea6f158e 100644 (file)
@@ -126,24 +126,8 @@ void PrepareLocalImageRequest<I>::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<I>::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<I>::create(m_global_image_id);
     break;
   case cls::rbd::MIRROR_IMAGE_MODE_SNAPSHOT:
     // TODO
@@ -154,6 +138,9 @@ void PrepareLocalImageRequest<I>::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);
 }
 
index 7c45648b87b4aa3fa8c6e704a31a681a89c4cf7b..dda6204ed6ade14b2e6463cfdb0f3a29fefea5e7 100644 (file)
@@ -34,6 +34,19 @@ StateBuilder<I>::~StateBuilder() {
   ceph_assert(m_sync_point_handler == nullptr);
 }
 
+template <typename I>
+bool StateBuilder<I>::is_local_primary() const  {
+  return (!local_image_id.empty() &&
+          local_promotion_state == librbd::mirror::PROMOTION_STATE_PRIMARY);
+}
+
+template <typename I>
+bool StateBuilder<I>::is_linked() const {
+  return (local_promotion_state ==
+            librbd::mirror::PROMOTION_STATE_NON_PRIMARY &&
+          local_primary_mirror_uuid == remote_mirror_uuid);
+}
+
 template <typename I>
 void StateBuilder<I>::close_local_image(Context* on_finish) {
   if (local_image_ctx == nullptr) {
index 22c5ee5c0a5b619148f323985181be4dd32bc8d0..ff291617ad840fe93608ea3383b9b25df92811f4 100644 (file)
@@ -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;
index ed1cf6911ed2772ca509243dcb42f5b41bf8cab7..2b7a463671af0ea03422c9589cc1eb76c6c0d84a 100644 (file)
@@ -54,17 +54,6 @@ bool StateBuilder<I>::is_disconnected() const {
   return (remote_client_state == cls::journal::CLIENT_STATE_DISCONNECTED);
 }
 
-template <typename I>
-bool StateBuilder<I>::is_local_primary() const  {
-  return (!this->local_image_id.empty() &&
-          local_tag_owner == librbd::Journal<>::LOCAL_MIRROR_UUID);
-}
-
-template <typename I>
-bool StateBuilder<I>::is_linked() const {
-  return (local_tag_owner == this->remote_mirror_uuid);
-}
-
 template <typename I>
 cls::rbd::MirrorImageMode StateBuilder<I>::get_mirror_image_mode() const {
   return cls::rbd::MIRROR_IMAGE_MODE_JOURNAL;
index c760a66ce26c2b79ff145f70ad6391fe3f362e88..c09f2a7f4fdf119eb13bc39a8de1375deec082a3 100644 (file)
@@ -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;