]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/tools/rbd_mirror/image_replayer/PrepareRemoteImageRequest.h
update sources to v12.2.3
[ceph.git] / ceph / src / tools / rbd_mirror / image_replayer / PrepareRemoteImageRequest.h
index 9943fd742a7ed4fc5b142d4c3f999a0064b1e25a..8d8f553d5362efc3cb77d779cd715ee76ad16e28 100644 (file)
@@ -5,40 +5,68 @@
 #define RBD_MIRROR_IMAGE_REPLAYER_PREPARE_REMOTE_IMAGE_REQUEST_H
 
 #include "include/buffer.h"
+#include "cls/journal/cls_journal_types.h"
+#include "librbd/journal/TypeTraits.h"
 #include <string>
 
+namespace journal { class Journaler; }
 namespace librados { struct IoCtx; }
 namespace librbd { struct ImageCtx; }
+namespace librbd { namespace journal { struct MirrorPeerClientMeta; } }
 
 struct Context;
 struct ContextWQ;
 
 namespace rbd {
 namespace mirror {
+
+template <typename> struct Threads;
+
 namespace image_replayer {
 
 template <typename ImageCtxT = librbd::ImageCtx>
 class PrepareRemoteImageRequest {
 public:
-  static PrepareRemoteImageRequest *create(librados::IoCtx &io_ctx,
+  typedef librbd::journal::TypeTraits<ImageCtxT> TypeTraits;
+  typedef typename TypeTraits::Journaler Journaler;
+  typedef librbd::journal::MirrorPeerClientMeta MirrorPeerClientMeta;
+
+  static PrepareRemoteImageRequest *create(Threads<ImageCtxT> *threads,
+                                           librados::IoCtx &remote_io_ctx,
                                            const std::string &global_image_id,
+                                           const std::string &local_mirror_uuid,
+                                           const std::string &local_image_id,
                                            std::string *remote_mirror_uuid,
                                            std::string *remote_image_id,
+                                           Journaler **remote_journaler,
+                                           cls::journal::ClientState *client_state,
+                                           MirrorPeerClientMeta *client_meta,
                                            Context *on_finish) {
-    return new PrepareRemoteImageRequest(io_ctx, global_image_id,
-                                         remote_mirror_uuid, remote_image_id,
-                                         on_finish);
+    return new PrepareRemoteImageRequest(threads, remote_io_ctx,
+                                         global_image_id, local_mirror_uuid,
+                                         local_image_id, remote_mirror_uuid,
+                                         remote_image_id, remote_journaler,
+                                         client_state, client_meta, on_finish);
   }
 
-  PrepareRemoteImageRequest(librados::IoCtx &io_ctx,
+  PrepareRemoteImageRequest(Threads<ImageCtxT> *threads,
+                           librados::IoCtx &remote_io_ctx,
                            const std::string &global_image_id,
+                           const std::string &local_mirror_uuid,
+                           const std::string &local_image_id,
                            std::string *remote_mirror_uuid,
                            std::string *remote_image_id,
+                           Journaler **remote_journaler,
+                           cls::journal::ClientState *client_state,
+                           MirrorPeerClientMeta *client_meta,
                            Context *on_finish)
-    : m_io_ctx(io_ctx), m_global_image_id(global_image_id),
+    : m_threads(threads), m_remote_io_ctx(remote_io_ctx),
+      m_global_image_id(global_image_id),
+      m_local_mirror_uuid(local_mirror_uuid), m_local_image_id(local_image_id),
       m_remote_mirror_uuid(remote_mirror_uuid),
       m_remote_image_id(remote_image_id),
-      m_on_finish(on_finish) {
+      m_remote_journaler(remote_journaler), m_client_state(client_state),
+      m_client_meta(client_meta), m_on_finish(on_finish) {
   }
 
   void send();
@@ -56,18 +84,31 @@ private:
    * GET_REMOTE_IMAGE_ID
    *    |
    *    v
+   * GET_CLIENT
+   *    |
+   *    v (skip if not needed)
+   * REGISTER_CLIENT
+   *    |
+   *    v
    * <finish>
 
    * @endverbatim
    */
 
-  librados::IoCtx &m_io_ctx;
+  Threads<ImageCtxT> *m_threads;
+  librados::IoCtx &m_remote_io_ctx;
   std::string m_global_image_id;
+  std::string m_local_mirror_uuid;
+  std::string m_local_image_id;
   std::string *m_remote_mirror_uuid;
   std::string *m_remote_image_id;
+  Journaler **m_remote_journaler;
+  cls::journal::ClientState *m_client_state;
+  MirrorPeerClientMeta *m_client_meta;
   Context *m_on_finish;
 
   bufferlist m_out_bl;
+  cls::journal::Client m_client;
 
   void get_remote_mirror_uuid();
   void handle_get_remote_mirror_uuid(int r);
@@ -75,8 +116,15 @@ private:
   void get_remote_image_id();
   void handle_get_remote_image_id(int r);
 
+  void get_client();
+  void handle_get_client(int r);
+
+  void register_client();
+  void handle_register_client(int r);
+
   void finish(int r);
 
+  bool decode_client_meta();
 };
 
 } // namespace image_replayer