]> git.proxmox.com Git - ceph.git/blame - ceph/src/tools/rbd_mirror/image_replayer/PrepareRemoteImageRequest.h
update source to Ceph Pacific 16.2.2
[ceph.git] / ceph / src / tools / rbd_mirror / image_replayer / PrepareRemoteImageRequest.h
CommitLineData
d2e6a577
FG
1// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2// vim: ts=8 sw=2 smarttab
3
4#ifndef RBD_MIRROR_IMAGE_REPLAYER_PREPARE_REMOTE_IMAGE_REQUEST_H
5#define RBD_MIRROR_IMAGE_REPLAYER_PREPARE_REMOTE_IMAGE_REQUEST_H
6
11fdf7f2
TL
7#include "include/buffer_fwd.h"
8#include "include/rados/librados_fwd.hpp"
b32b8144 9#include "cls/journal/cls_journal_types.h"
9f95a23c
TL
10#include "cls/rbd/cls_rbd_types.h"
11#include "librbd/journal/Types.h"
b32b8144 12#include "librbd/journal/TypeTraits.h"
9f95a23c
TL
13#include "librbd/mirror/Types.h"
14#include "tools/rbd_mirror/Types.h"
d2e6a577
FG
15#include <string>
16
b32b8144 17namespace journal { class Journaler; }
9f95a23c 18namespace journal { struct CacheManagerHandler; }
d2e6a577 19namespace librbd { struct ImageCtx; }
b32b8144 20namespace librbd { namespace journal { struct MirrorPeerClientMeta; } }
d2e6a577
FG
21
22struct Context;
d2e6a577
FG
23
24namespace rbd {
25namespace mirror {
b32b8144
FG
26
27template <typename> struct Threads;
28
d2e6a577
FG
29namespace image_replayer {
30
9f95a23c
TL
31template <typename> class StateBuilder;
32
d2e6a577
FG
33template <typename ImageCtxT = librbd::ImageCtx>
34class PrepareRemoteImageRequest {
35public:
b32b8144
FG
36 typedef librbd::journal::TypeTraits<ImageCtxT> TypeTraits;
37 typedef typename TypeTraits::Journaler Journaler;
38 typedef librbd::journal::MirrorPeerClientMeta MirrorPeerClientMeta;
39
9f95a23c
TL
40 static PrepareRemoteImageRequest *create(
41 Threads<ImageCtxT> *threads,
42 librados::IoCtx &local_io_ctx,
43 librados::IoCtx &remote_io_ctx,
44 const std::string &global_image_id,
45 const std::string &local_mirror_uuid,
46 const RemotePoolMeta& remote_pool_meta,
47 ::journal::CacheManagerHandler *cache_manager_handler,
48 StateBuilder<ImageCtxT>** state_builder,
49 Context *on_finish) {
50 return new PrepareRemoteImageRequest(threads, local_io_ctx, remote_io_ctx,
b32b8144 51 global_image_id, local_mirror_uuid,
9f95a23c
TL
52 remote_pool_meta,
53 cache_manager_handler, state_builder,
54 on_finish);
d2e6a577
FG
55 }
56
9f95a23c
TL
57 PrepareRemoteImageRequest(
58 Threads<ImageCtxT> *threads,
59 librados::IoCtx &local_io_ctx,
60 librados::IoCtx &remote_io_ctx,
61 const std::string &global_image_id,
62 const std::string &local_mirror_uuid,
63 const RemotePoolMeta& remote_pool_meta,
64 ::journal::CacheManagerHandler *cache_manager_handler,
65 StateBuilder<ImageCtxT>** state_builder,
66 Context *on_finish)
67 : m_threads(threads),
68 m_local_io_ctx(local_io_ctx),
69 m_remote_io_ctx(remote_io_ctx),
b32b8144 70 m_global_image_id(global_image_id),
9f95a23c
TL
71 m_local_mirror_uuid(local_mirror_uuid),
72 m_remote_pool_meta(remote_pool_meta),
73 m_cache_manager_handler(cache_manager_handler),
74 m_state_builder(state_builder),
75 m_on_finish(on_finish) {
d2e6a577
FG
76 }
77
78 void send();
79
80private:
81 /**
82 * @verbatim
83 *
84 * <start>
85 * |
86 * v
d2e6a577
FG
87 * GET_REMOTE_IMAGE_ID
88 * |
89 * v
9f95a23c 90 * GET_REMOTE_MIRROR_INFO
b32b8144 91 * |
9f95a23c
TL
92 * | (journal)
93 * \-----------> GET_CLIENT
94 * | |
95 * | v (skip if not needed)
96 * | REGISTER_CLIENT
97 * | |
98 * | |
99 * |/----------------/
b32b8144
FG
100 * |
101 * v
d2e6a577 102 * <finish>
9f95a23c 103 *
d2e6a577
FG
104 * @endverbatim
105 */
106
b32b8144 107 Threads<ImageCtxT> *m_threads;
9f95a23c 108 librados::IoCtx &m_local_io_ctx;
b32b8144 109 librados::IoCtx &m_remote_io_ctx;
d2e6a577 110 std::string m_global_image_id;
b32b8144 111 std::string m_local_mirror_uuid;
9f95a23c
TL
112 RemotePoolMeta m_remote_pool_meta;
113 ::journal::CacheManagerHandler *m_cache_manager_handler;
114 StateBuilder<ImageCtxT>** m_state_builder;
d2e6a577
FG
115 Context *m_on_finish;
116
117 bufferlist m_out_bl;
9f95a23c
TL
118 std::string m_remote_image_id;
119 cls::rbd::MirrorImage m_mirror_image;
120 librbd::mirror::PromotionState m_promotion_state =
121 librbd::mirror::PROMOTION_STATE_UNKNOWN;
122 std::string m_primary_mirror_uuid;
123
124 // journal-based mirroring
125 Journaler *m_remote_journaler = nullptr;
b32b8144 126 cls::journal::Client m_client;
d2e6a577 127
d2e6a577
FG
128 void get_remote_image_id();
129 void handle_get_remote_image_id(int r);
130
9f95a23c
TL
131 void get_mirror_info();
132 void handle_get_mirror_info(int r);
133
b32b8144
FG
134 void get_client();
135 void handle_get_client(int r);
136
137 void register_client();
138 void handle_register_client(int r);
139
9f95a23c
TL
140 void finalize_journal_state_builder(cls::journal::ClientState client_state,
141 const MirrorPeerClientMeta& client_meta);
142 void finalize_snapshot_state_builder(int r);
143
d2e6a577 144 void finish(int r);
d2e6a577
FG
145};
146
147} // namespace image_replayer
148} // namespace mirror
149} // namespace rbd
150
151extern template class rbd::mirror::image_replayer::PrepareRemoteImageRequest<librbd::ImageCtx>;
152
153#endif // RBD_MIRROR_IMAGE_REPLAYER_PREPARE_REMOTE_IMAGE_REQUEST_H