]> git.proxmox.com Git - ceph.git/blob - ceph/src/librbd/image/RefreshRequest.h
update sources to v12.2.3
[ceph.git] / ceph / src / librbd / image / RefreshRequest.h
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
3
4 #ifndef CEPH_LIBRBD_IMAGE_REFRESH_REQUEST_H
5 #define CEPH_LIBRBD_IMAGE_REFRESH_REQUEST_H
6
7 #include "include/int_types.h"
8 #include "include/buffer.h"
9 #include "include/utime.h"
10 #include "common/snap_types.h"
11 #include "cls/lock/cls_lock_types.h"
12 #include "librbd/ImageCtx.h"
13 #include "librbd/Types.h"
14 #include <string>
15 #include <vector>
16
17 class Context;
18
19 namespace librbd {
20
21 class ImageCtx;
22
23 namespace image {
24
25 template<typename> class RefreshParentRequest;
26
27 template<typename ImageCtxT = ImageCtx>
28 class RefreshRequest {
29 public:
30 static RefreshRequest *create(ImageCtxT &image_ctx, bool acquiring_lock,
31 bool skip_open_parent, Context *on_finish) {
32 return new RefreshRequest(image_ctx, acquiring_lock, skip_open_parent,
33 on_finish);
34 }
35
36 RefreshRequest(ImageCtxT &image_ctx, bool acquiring_lock,
37 bool skip_open_parent, Context *on_finish);
38 ~RefreshRequest();
39
40 void send();
41
42 private:
43 /**
44 * @verbatim
45 *
46 * <start>
47 * |
48 * | (v1)
49 * |-----> V1_READ_HEADER ---> V1_GET_SNAPSHOTS ---> V1_GET_LOCKS
50 * | |
51 * | (v2) v
52 * \-----> V2_GET_MUTABLE_METADATA <apply>
53 * | |
54 * v |
55 * V2_GET_METADATA |
56 * | |
57 * v |
58 * V2_GET_FLAGS |
59 * | |
60 * v |
61 * V2_GET_GROUP |
62 * | |
63 * v |
64 * V2_GET_SNAPSHOTS (skip if no snaps) |
65 * | |
66 * v |
67 * V2_GET_SNAP_TIMESTAMPS |
68 * | |
69 * v |
70 * V2_GET_SNAP_NAMESPACES |
71 * | |
72 * v |
73 * V2_REFRESH_PARENT (skip if no parent or |
74 * | refresh not needed) |
75 * v |
76 * V2_INIT_EXCLUSIVE_LOCK (skip if lock |
77 * | active or disabled) |
78 * v |
79 * V2_OPEN_OBJECT_MAP (skip if map |
80 * | active or disabled) |
81 * v |
82 * V2_OPEN_JOURNAL (skip if journal |
83 * | active or disabled) |
84 * v |
85 * V2_BLOCK_WRITES (skip if journal not |
86 * | disabled) |
87 * v |
88 * <apply> |
89 * | |
90 * v |
91 * V2_FINALIZE_REFRESH_PARENT (skip if refresh |
92 * | not needed) |
93 * (error) v |
94 * * * * * > V2_SHUT_DOWN_EXCLUSIVE_LOCK (skip if lock |
95 * | active or enabled) |
96 * v |
97 * V2_CLOSE_JOURNAL (skip if journal inactive |
98 * | or enabled) |
99 * v |
100 * V2_CLOSE_OBJECT_MAP (skip if map inactive |
101 * | or enabled) |
102 * | |
103 * \-------------------\/--------------------/
104 * |
105 * v
106 * FLUSH (skip if no new
107 * | snapshots)
108 * v
109 * <finish>
110 *
111 * @endverbatim
112 */
113
114 ImageCtxT &m_image_ctx;
115 bool m_acquiring_lock;
116 bool m_skip_open_parent_image;
117 Context *m_on_finish;
118
119 int m_error_result;
120 bool m_flush_aio;
121 decltype(m_image_ctx.exclusive_lock) m_exclusive_lock;
122 decltype(m_image_ctx.object_map) m_object_map;
123 decltype(m_image_ctx.journal) m_journal;
124 RefreshParentRequest<ImageCtxT> *m_refresh_parent;
125
126 bufferlist m_out_bl;
127
128 uint8_t m_order;
129 uint64_t m_size;
130 uint64_t m_features;
131 uint64_t m_incompatible_features;
132 uint64_t m_flags;
133
134 std::string m_last_metadata_key;
135 std::map<std::string, bufferlist> m_metadata;
136
137 std::string m_object_prefix;
138 ParentInfo m_parent_md;
139 cls::rbd::GroupSpec m_group_spec;
140
141 ::SnapContext m_snapc;
142 std::vector<std::string> m_snap_names;
143 std::vector<cls::rbd::SnapshotNamespace> m_snap_namespaces;
144 std::vector<uint64_t> m_snap_sizes;
145 std::vector<ParentInfo> m_snap_parents;
146 std::vector<uint8_t> m_snap_protection;
147 std::vector<uint64_t> m_snap_flags;
148 std::vector<utime_t> m_snap_timestamps;
149
150 std::map<rados::cls::lock::locker_id_t,
151 rados::cls::lock::locker_info_t> m_lockers;
152 std::string m_lock_tag;
153 bool m_exclusive_locked;
154
155 bool m_blocked_writes = false;
156 bool m_incomplete_update = false;
157
158 void send_v1_read_header();
159 Context *handle_v1_read_header(int *result);
160
161 void send_v1_get_snapshots();
162 Context *handle_v1_get_snapshots(int *result);
163
164 void send_v1_get_locks();
165 Context *handle_v1_get_locks(int *result);
166
167 void send_v1_apply();
168 Context *handle_v1_apply(int *result);
169
170 void send_v2_get_mutable_metadata();
171 Context *handle_v2_get_mutable_metadata(int *result);
172
173 void send_v2_get_metadata();
174 Context *handle_v2_get_metadata(int *result);
175
176 void send_v2_get_flags();
177 Context *handle_v2_get_flags(int *result);
178
179 void send_v2_get_group();
180 Context *handle_v2_get_group(int *result);
181
182 void send_v2_get_snapshots();
183 Context *handle_v2_get_snapshots(int *result);
184
185 void send_v2_get_snap_namespaces();
186 Context *handle_v2_get_snap_namespaces(int *result);
187
188 void send_v2_get_snap_timestamps();
189 Context *handle_v2_get_snap_timestamps(int *result);
190
191 void send_v2_refresh_parent();
192 Context *handle_v2_refresh_parent(int *result);
193
194 void send_v2_init_exclusive_lock();
195 Context *handle_v2_init_exclusive_lock(int *result);
196
197 void send_v2_open_journal();
198 Context *handle_v2_open_journal(int *result);
199
200 void send_v2_block_writes();
201 Context *handle_v2_block_writes(int *result);
202
203 void send_v2_open_object_map();
204 Context *handle_v2_open_object_map(int *result);
205
206 void send_v2_apply();
207 Context *handle_v2_apply(int *result);
208
209 Context *send_v2_finalize_refresh_parent();
210 Context *handle_v2_finalize_refresh_parent(int *result);
211
212 Context *send_v2_shut_down_exclusive_lock();
213 Context *handle_v2_shut_down_exclusive_lock(int *result);
214
215 Context *send_v2_close_journal();
216 Context *handle_v2_close_journal(int *result);
217
218 Context *send_v2_close_object_map();
219 Context *handle_v2_close_object_map(int *result);
220
221 Context *send_flush_aio();
222 Context *handle_flush_aio(int *result);
223
224 Context *handle_error(int *result);
225
226 void save_result(int *result) {
227 if (m_error_result == 0 && *result < 0) {
228 m_error_result = *result;
229 }
230 }
231
232 void apply();
233 int get_parent_info(uint64_t snap_id, ParentInfo *parent_md);
234 };
235
236 } // namespace image
237 } // namespace librbd
238
239 extern template class librbd::image::RefreshRequest<librbd::ImageCtx>;
240
241 #endif // CEPH_LIBRBD_IMAGE_REFRESH_REQUEST_H