]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: retrieve primary mirror uuid as part of get info request
authorJason Dillaman <dillaman@redhat.com>
Mon, 27 Jan 2020 15:15:46 +0000 (10:15 -0500)
committerJason Dillaman <dillaman@redhat.com>
Thu, 30 Jan 2020 15:26:36 +0000 (10:26 -0500)
This will be used for both journal and snapshot-based mirroring
to link the image to proper primary.

Signed-off-by: Jason Dillaman <dillaman@redhat.com>
17 files changed:
src/librbd/api/Mirror.cc
src/librbd/mirror/DemoteRequest.cc
src/librbd/mirror/DemoteRequest.h
src/librbd/mirror/DisableRequest.cc
src/librbd/mirror/DisableRequest.h
src/librbd/mirror/GetInfoRequest.cc
src/librbd/mirror/GetInfoRequest.h
src/librbd/mirror/GetStatusRequest.cc
src/librbd/mirror/GetStatusRequest.h
src/librbd/mirror/PromoteRequest.cc
src/librbd/mirror/PromoteRequest.h
src/test/librbd/mirror/test_mock_DisableRequest.cc
src/test/rbd_mirror/image_replayer/test_mock_BootstrapRequest.cc
src/tools/rbd_mirror/image_replayer/BootstrapRequest.cc
src/tools/rbd_mirror/image_replayer/BootstrapRequest.h
src/tools/rbd_mirror/image_replayer/OpenLocalImageRequest.cc
src/tools/rbd_mirror/image_replayer/OpenLocalImageRequest.h

index c2b4683fa7c1b48866a3b20558fcacdbff48001a..76be2138ffa9b5bce271cec28919c9ff35fe2ebb 100644 (file)
@@ -282,6 +282,7 @@ struct C_ImageGetInfo : public Context {
 
   cls::rbd::MirrorImage mirror_image;
   mirror::PromotionState promotion_state = mirror::PROMOTION_STATE_PRIMARY;
+  std::string primary_mirror_uuid;
 
   C_ImageGetInfo(mirror_image_info_t *mirror_image_info,
                  mirror_image_mode_t *mirror_image_mode,  Context *on_finish)
@@ -658,6 +659,7 @@ void Mirror<I>::image_get_info(I *ictx, mirror_image_info_t *mirror_image_info,
       auto ctx = new C_ImageGetInfo(mirror_image_info, nullptr, on_finish);
       auto req = mirror::GetInfoRequest<I>::create(*ictx, &ctx->mirror_image,
                                                    &ctx->promotion_state,
+                                                   &ctx->primary_mirror_uuid,
                                                    ctx);
       req->send();
     });
@@ -694,7 +696,8 @@ void Mirror<I>::image_get_info(librados::IoCtx& io_ctx,
   auto ctx = new C_ImageGetInfo(mirror_image_info, nullptr, on_finish);
   auto req = mirror::GetInfoRequest<I>::create(io_ctx, op_work_queue, image_id,
                                                &ctx->mirror_image,
-                                               &ctx->promotion_state, ctx);
+                                               &ctx->promotion_state,
+                                               &ctx->primary_mirror_uuid, ctx);
   req->send();
 }
 
@@ -722,7 +725,7 @@ void Mirror<I>::image_get_mode(I *ictx, mirror_image_mode_t *mode,
   auto ctx = new C_ImageGetInfo(nullptr, mode, on_finish);
   auto req = mirror::GetInfoRequest<I>::create(*ictx, &ctx->mirror_image,
                                                &ctx->promotion_state,
-                                               ctx);
+                                               &ctx->primary_mirror_uuid, ctx);
   req->send();
 }
 
index 171b86b1f896e63489fc904f8c518815779b6a5e..f70c2020c2938f75627df7334367b2ec345bfbb2 100644 (file)
@@ -36,7 +36,8 @@ void DemoteRequest<I>::get_info() {
   auto ctx = create_context_callback<
     DemoteRequest<I>, &DemoteRequest<I>::handle_get_info>(this);
   auto req = GetInfoRequest<I>::create(m_image_ctx, &m_mirror_image,
-                                       &m_promotion_state, ctx);
+                                       &m_promotion_state,
+                                       &m_primary_mirror_uuid, ctx);
   req->send();
 }
 
index 7dc0585e056c5ea10cb969edd7e32e2c9809feb3..ab923906845243c5ebb4139093279966b40228b3 100644 (file)
@@ -60,6 +60,7 @@ private:
 
   cls::rbd::MirrorImage m_mirror_image;
   PromotionState m_promotion_state = PROMOTION_STATE_PRIMARY;
+  std::string m_primary_mirror_uuid;
 
   void get_info();
   void handle_get_info(int r);
index bdbb28504f6f5e8f790726229574031cb77c0e14..2c0f669b3586b703d0d0c5bcc2f8de2f6bf1bc37 100644 (file)
@@ -48,7 +48,8 @@ void DisableRequest<I>::send_get_mirror_info() {
       klass, &klass::handle_get_mirror_info>(this);
 
   auto req = GetInfoRequest<I>::create(*m_image_ctx, &m_mirror_image,
-                                       &m_promotion_state, ctx);
+                                       &m_promotion_state,
+                                       &m_primary_mirror_uuid, ctx);
   req->send();
 }
 
index 1434d3f3ee8eacea017b0487343b10199d2ff422..d753076243ad8fe65ae1699e22d4d482a2de0fb7 100644 (file)
@@ -87,6 +87,7 @@ private:
   bool m_is_primary = false;
   cls::rbd::MirrorImage m_mirror_image;
   PromotionState m_promotion_state = PROMOTION_STATE_NON_PRIMARY;
+  std::string m_primary_mirror_uuid;
   std::set<cls::journal::Client> m_clients;
   std::map<std::string, int> m_ret;
   std::map<std::string, int> m_current_ops;
index 7e50b06390c681a334ff253645dd2aca5f40f9d6..e8f2134ff907d7b43e4d604768b24d65aba54a27 100644 (file)
@@ -27,10 +27,11 @@ GetInfoRequest<I>::GetInfoRequest(librados::IoCtx& io_ctx,
                                   const std::string &image_id,
                                   cls::rbd::MirrorImage *mirror_image,
                                   PromotionState *promotion_state,
+                                  std::string* primary_mirror_uuid,
                                   Context *on_finish)
   : m_io_ctx(io_ctx), m_op_work_queue(op_work_queue), m_image_id(image_id),
     m_mirror_image(mirror_image), m_promotion_state(promotion_state),
-    m_on_finish(on_finish),
+    m_primary_mirror_uuid(primary_mirror_uuid), m_on_finish(on_finish),
     m_cct(reinterpret_cast<CephContext *>(io_ctx.cct())) {
 }
 
@@ -38,11 +39,13 @@ template <typename I>
 GetInfoRequest<I>::GetInfoRequest(I &image_ctx,
                                   cls::rbd::MirrorImage *mirror_image,
                                   PromotionState *promotion_state,
+                                  std::string* primary_mirror_uuid,
                                   Context *on_finish)
   : m_image_ctx(&image_ctx), m_io_ctx(image_ctx.md_ctx),
     m_op_work_queue(image_ctx.op_work_queue), m_image_id(image_ctx.id),
     m_mirror_image(mirror_image), m_promotion_state(promotion_state),
-    m_on_finish(on_finish), m_cct(image_ctx.cct) {
+    m_primary_mirror_uuid(primary_mirror_uuid), m_on_finish(on_finish),
+    m_cct(image_ctx.cct) {
 }
 
 template <typename I>
@@ -120,8 +123,12 @@ void GetInfoRequest<I>::handle_get_journal_tag_owner(int r) {
 
   if (m_mirror_uuid == Journal<>::LOCAL_MIRROR_UUID) {
     *m_promotion_state = PROMOTION_STATE_PRIMARY;
+    *m_primary_mirror_uuid = "";
   } else if (m_mirror_uuid == Journal<>::ORPHAN_MIRROR_UUID) {
     *m_promotion_state = PROMOTION_STATE_ORPHAN;
+    *m_primary_mirror_uuid = "";
+  } else {
+    *m_primary_mirror_uuid = m_mirror_uuid;
   }
 
   finish(0);
@@ -240,6 +247,7 @@ template <typename I>
 void GetInfoRequest<I>::calc_promotion_state(
     const std::map<librados::snap_t, SnapInfo> &snap_info) {
   *m_promotion_state = PROMOTION_STATE_PRIMARY;
+  *m_primary_mirror_uuid = "";
 
   for (auto it = snap_info.rbegin(); it != snap_info.rend(); it++) {
     auto primary = boost::get<cls::rbd::MirrorPrimarySnapshotNamespace>(
@@ -258,12 +266,14 @@ void GetInfoRequest<I>::calc_promotion_state(
         *m_promotion_state = PROMOTION_STATE_ORPHAN;
       } else {
         *m_promotion_state = PROMOTION_STATE_NON_PRIMARY;
+        *m_primary_mirror_uuid = non_primary->primary_mirror_uuid;
       }
       break;
     }
   }
 
-  ldout(m_cct, 20) << *m_promotion_state << dendl;
+  ldout(m_cct, 10) << "promotion_state=" << *m_promotion_state << ", "
+                   << "primary_mirror_uuid=" << *m_promotion_state << dendl;
 }
 
 } // namespace mirror
index 470c1b0be106939a20bc932e2f9c1ccc1612372d..28308ae954501bf30ac4566ae1a454f676dd91d4 100644 (file)
@@ -31,24 +31,28 @@ public:
                                 const std::string &image_id,
                                 cls::rbd::MirrorImage *mirror_image,
                                 PromotionState *promotion_state,
+                                std::string* primary_mirror_uuid,
                                 Context *on_finish) {
     return new GetInfoRequest(io_ctx, op_work_queue, image_id, mirror_image,
-                              promotion_state, on_finish);
+                              promotion_state, primary_mirror_uuid, on_finish);
   }
   static GetInfoRequest *create(ImageCtxT &image_ctx,
                                 cls::rbd::MirrorImage *mirror_image,
                                 PromotionState *promotion_state,
+                                std::string* primary_mirror_uuid,
                                 Context *on_finish) {
     return new GetInfoRequest(image_ctx, mirror_image, promotion_state,
-                              on_finish);
+                              primary_mirror_uuid, on_finish);
   }
 
   GetInfoRequest(librados::IoCtx& io_ctx, ContextWQ *op_work_queue,
                  const std::string &image_id,
                  cls::rbd::MirrorImage *mirror_image,
-                 PromotionState *promotion_state, Context *on_finish);
+                 PromotionState *promotion_state,
+                 std::string* primary_mirror_uuid, Context *on_finish);
   GetInfoRequest(ImageCtxT &image_ctx, cls::rbd::MirrorImage *mirror_image,
-                 PromotionState *promotion_state, Context *on_finish);
+                 PromotionState *promotion_state,
+                 std::string* primary_mirror_uuid, Context *on_finish);
 
   void send();
 
@@ -83,6 +87,7 @@ private:
   std::string m_image_id;
   cls::rbd::MirrorImage *m_mirror_image;
   PromotionState *m_promotion_state;
+  std::string* m_primary_mirror_uuid;
   Context *m_on_finish;
 
   CephContext *m_cct;
index e6b7f81843649f9ded3fb72b939f7dbbde9f756f..e5afb4869058a87e5e27964824b1ed24c10e8ee3 100644 (file)
@@ -39,7 +39,8 @@ void GetStatusRequest<I>::get_info() {
   auto ctx = create_context_callback<
     GetStatusRequest<I>, &GetStatusRequest<I>::handle_get_info>(this);
   auto req = GetInfoRequest<I>::create(m_image_ctx, m_mirror_image,
-                                       m_promotion_state, ctx);
+                                       m_promotion_state,
+                                       &m_primary_mirror_uuid, ctx);
   req->send();
 }
 
index 4c1a81f08f024f4746a0524faf2db6768dffd6c4..581a0d6674987b2573393529956ad1412de88cb1 100644 (file)
@@ -65,6 +65,7 @@ private:
   Context *m_on_finish;
 
   bufferlist m_out_bl;
+  std::string m_primary_mirror_uuid;
 
   void get_info();
   void handle_get_info(int r);
index e2bc6bd0582fd2de6c9b7f74c0acdf7229f8a725..2b829fb8a2829ec1f821d8ce2e72cf9c24e71fee 100644 (file)
@@ -35,7 +35,8 @@ void PromoteRequest<I>::get_info() {
   auto ctx = create_context_callback<
     PromoteRequest<I>, &PromoteRequest<I>::handle_get_info>(this);
   auto req = GetInfoRequest<I>::create(m_image_ctx, &m_mirror_image,
-                                       &m_promotion_state, ctx);
+                                       &m_promotion_state,
+                                       &m_primary_mirror_uuid, ctx);
   req->send();
 }
 
index 17609c5ff8cafdfed24297dff54e69b919a7ea42..c54f3bb76aca1d47c2773ab7ddac1666b98aab90 100644 (file)
@@ -56,6 +56,7 @@ private:
 
   cls::rbd::MirrorImage m_mirror_image;
   PromotionState m_promotion_state = PROMOTION_STATE_PRIMARY;
+  std::string m_primary_mirror_uuid;
 
   void get_info();
   void handle_get_info(int r);
index 688bddb99dcc815bdfca36d89f9ebcc247c65342..684c05d100df2fbce99b8dbda0913c72e58f845d 100644 (file)
@@ -83,6 +83,7 @@ struct GetInfoRequest<librbd::MockTestImageCtx> {
   static GetInfoRequest *create(librbd::MockTestImageCtx &,
                                 cls::rbd::MirrorImage *mirror_image,
                                 PromotionState *promotion_state,
+                                std::string* primary_mirror_uuid,
                                 Context *on_finish) {
     ceph_assert(s_instance != nullptr);
     s_instance->mirror_image = mirror_image;
index d63d596461add2c24933a6763400edca143a073b..6928b426f0c196e409a948adf502d6d5e6c6a369 100644 (file)
@@ -43,6 +43,7 @@ struct GetInfoRequest<librbd::MockTestImageCtx> {
   static GetInfoRequest* create(librbd::MockTestImageCtx &image_ctx,
                                 cls::rbd::MirrorImage *mirror_image,
                                 PromotionState *promotion_state,
+                                std::string* primary_mirror_uuid,
                                 Context *on_finish) {
     ceph_assert(s_instance != nullptr);
     s_instance->mirror_image = mirror_image;
index 442404c7cc228138b0d144fb04b5f13aa8dc7b70..334759ae19da2ff20eed1f4208613b1ac529a010 100644 (file)
@@ -239,7 +239,8 @@ void BootstrapRequest<I>::get_remote_mirror_info() {
     BootstrapRequest<I>, &BootstrapRequest<I>::handle_get_remote_mirror_info>(
       this);
   auto request = librbd::mirror::GetInfoRequest<I>::create(
-    *m_remote_image_ctx, &m_mirror_image, &m_promotion_state, ctx);
+    *m_remote_image_ctx, &m_mirror_image, &m_promotion_state,
+    &m_remote_primary_mirror_uuid, ctx);
   request->send();
 }
 
@@ -285,7 +286,6 @@ void BootstrapRequest<I>::handle_get_remote_mirror_info(int r) {
     return;
   }
 
-
   if ((*m_state_builder)->local_image_id.empty()) {
     create_local_image();
     return;
index b5f14c816c44ba3076e54531c62b36dd4da3cf37..42010b6e91ae87e4730fbbe572f20c4869a0d5ff 100644 (file)
@@ -142,6 +142,7 @@ private:
   cls::rbd::MirrorImage m_mirror_image;
   librbd::mirror::PromotionState m_promotion_state =
     librbd::mirror::PROMOTION_STATE_NON_PRIMARY;
+  std::string m_remote_primary_mirror_uuid;
   int m_ret_val = 0;
 
   std::string m_local_image_name;
index a4969ef6ec1225dc3559b4b3b7a9b407b268b5dd..a027152024479bcda46cb0dc59a693f248626016 100644 (file)
@@ -158,7 +158,8 @@ void OpenLocalImageRequest<I>::send_get_mirror_info() {
     &OpenLocalImageRequest<I>::handle_get_mirror_info>(
       this);
   auto request = librbd::mirror::GetInfoRequest<I>::create(
-    **m_local_image_ctx, &m_mirror_image, &m_promotion_state, ctx);
+    **m_local_image_ctx, &m_mirror_image, &m_promotion_state,
+    &m_primary_mirror_uuid, ctx);
   request->send();
 }
 
index 7acf349046b63bfbd8d691cfe24606a6a863ebf5..31e7add9575083012373685d90b83004c00bdae4 100644 (file)
@@ -67,6 +67,7 @@ private:
   cls::rbd::MirrorImage m_mirror_image;
   librbd::mirror::PromotionState m_promotion_state =
     librbd::mirror::PROMOTION_STATE_NON_PRIMARY;
+  std::string m_primary_mirror_uuid;
   int m_ret_val = 0;
 
   void send_open_image();