]> git.proxmox.com Git - ceph.git/blame - ceph/src/tools/rbd_mirror/image_sync/ImageCopyRequest.h
bump version to 12.2.12-pve1
[ceph.git] / ceph / src / tools / rbd_mirror / image_sync / ImageCopyRequest.h
CommitLineData
7c673cae
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_SYNC_IMAGE_COPY_REQUEST_H
5#define RBD_MIRROR_IMAGE_SYNC_IMAGE_COPY_REQUEST_H
6
7#include "include/int_types.h"
8#include "include/rados/librados.hpp"
9#include "common/Mutex.h"
10#include "librbd/journal/Types.h"
11#include "librbd/journal/TypeTraits.h"
12#include "tools/rbd_mirror/BaseRequest.h"
13#include <map>
14#include <vector>
15
16class Context;
17class SafeTimer;
18namespace journal { class Journaler; }
19namespace librbd { struct ImageCtx; }
20
21namespace rbd {
22namespace mirror {
23
24class ProgressContext;
25
26namespace image_sync {
27
28template <typename ImageCtxT = librbd::ImageCtx>
29class ImageCopyRequest : public BaseRequest {
30public:
31 typedef std::vector<librados::snap_t> SnapIds;
32 typedef std::map<librados::snap_t, SnapIds> SnapMap;
33 typedef librbd::journal::TypeTraits<ImageCtxT> TypeTraits;
34 typedef typename TypeTraits::Journaler Journaler;
35 typedef librbd::journal::MirrorPeerSyncPoint MirrorPeerSyncPoint;
36 typedef librbd::journal::MirrorPeerClientMeta MirrorPeerClientMeta;
37 typedef rbd::mirror::ProgressContext ProgressContext;
38
39 static ImageCopyRequest* create(ImageCtxT *local_image_ctx,
40 ImageCtxT *remote_image_ctx,
41 SafeTimer *timer, Mutex *timer_lock,
42 Journaler *journaler,
43 MirrorPeerClientMeta *client_meta,
44 MirrorPeerSyncPoint *sync_point,
45 Context *on_finish,
46 ProgressContext *progress_ctx = nullptr) {
47 return new ImageCopyRequest(local_image_ctx, remote_image_ctx, timer,
48 timer_lock, journaler, client_meta, sync_point,
49 on_finish, progress_ctx);
50 }
51
52 ImageCopyRequest(ImageCtxT *local_image_ctx, ImageCtxT *remote_image_ctx,
53 SafeTimer *timer, Mutex *timer_lock, Journaler *journaler,
54 MirrorPeerClientMeta *client_meta,
55 MirrorPeerSyncPoint *sync_point, Context *on_finish,
56 ProgressContext *progress_ctx = nullptr);
57
58 void send() override;
59 void cancel() override;
60
61private:
62 /**
63 * @verbatim
64 *
65 * <start>
66 * |
67 * v
68 * UPDATE_MAX_OBJECT_COUNT
69 * |
70 * | . . . . .
71 * | . . (parallel execution of
72 * v v . multiple objects at once)
73 * COPY_OBJECT . .
74 * |
75 * v
76 * FLUSH_SYNC_POINT
77 * |
78 * v
79 * <finish>
80 *
81 * @endverbatim
82 */
83
84 ImageCtxT *m_local_image_ctx;
85 ImageCtxT *m_remote_image_ctx;
86 SafeTimer *m_timer;
87 Mutex *m_timer_lock;
88 Journaler *m_journaler;
89 MirrorPeerClientMeta *m_client_meta;
90 MirrorPeerSyncPoint *m_sync_point;
91 ProgressContext *m_progress_ctx;
92
93 SnapMap m_snap_map;
94
95 Mutex m_lock;
96 bool m_canceled = false;
97
98 uint64_t m_object_no = 0;
99 uint64_t m_end_object_no;
100 uint64_t m_current_ops = 0;
101 int m_ret_val = 0;
102
103 bool m_updating_sync_point;
104 Context *m_update_sync_ctx;
105 double m_update_sync_point_interval;
106
107 MirrorPeerClientMeta m_client_meta_copy;
108
109 void send_update_max_object_count();
110 void handle_update_max_object_count(int r);
111
112 void send_object_copies();
113 void send_next_object_copy();
114 void handle_object_copy(int r);
115
116 void send_update_sync_point();
117 void handle_update_sync_point(int r);
118
119 void send_flush_sync_point();
120 void handle_flush_sync_point(int r);
121
122 int compute_snap_map();
123
124 void update_progress(const std::string &description, bool flush = true);
125};
126
127} // namespace image_sync
128} // namespace mirror
129} // namespace rbd
130
131extern template class rbd::mirror::image_sync::ImageCopyRequest<librbd::ImageCtx>;
132
133#endif // RBD_MIRROR_IMAGE_SYNC_IMAGE_COPY_REQUEST_H