]> git.proxmox.com Git - ceph.git/blame - ceph/src/librbd/WatchNotifyTypes.h
update sources to 12.2.7
[ceph.git] / ceph / src / librbd / WatchNotifyTypes.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#ifndef LIBRBD_WATCH_NOTIFY_TYPES_H
4#define LIBRBD_WATCH_NOTIFY_TYPES_H
5
6#include "cls/rbd/cls_rbd_types.h"
7#include "include/int_types.h"
8#include "include/buffer_fwd.h"
9#include "include/encoding.h"
10#include "librbd/watcher/Types.h"
11#include <iosfwd>
12#include <list>
13#include <string>
14#include <boost/variant.hpp>
15
16namespace ceph {
17class Formatter;
18}
19
20namespace librbd {
21namespace watch_notify {
22
23using librbd::watcher::ClientId;
24
25WRITE_CLASS_ENCODER(ClientId);
26
27struct AsyncRequestId {
28 ClientId client_id;
29 uint64_t request_id;
30
31 AsyncRequestId() : request_id() {}
32 AsyncRequestId(const ClientId &client_id_, uint64_t request_id_)
33 : client_id(client_id_), request_id(request_id_) {}
34
35 void encode(bufferlist& bl) const;
36 void decode(bufferlist::iterator& it);
37 void dump(Formatter *f) const;
38
39 inline bool operator<(const AsyncRequestId &rhs) const {
40 if (client_id != rhs.client_id) {
41 return client_id < rhs.client_id;
42 } else {
43 return request_id < rhs.request_id;
44 }
45 }
46 inline bool operator!=(const AsyncRequestId &rhs) const {
47 return (client_id != rhs.client_id || request_id != rhs.request_id);
48 }
49};
50
51enum NotifyOp {
52 NOTIFY_OP_ACQUIRED_LOCK = 0,
53 NOTIFY_OP_RELEASED_LOCK = 1,
54 NOTIFY_OP_REQUEST_LOCK = 2,
55 NOTIFY_OP_HEADER_UPDATE = 3,
56 NOTIFY_OP_ASYNC_PROGRESS = 4,
57 NOTIFY_OP_ASYNC_COMPLETE = 5,
58 NOTIFY_OP_FLATTEN = 6,
59 NOTIFY_OP_RESIZE = 7,
60 NOTIFY_OP_SNAP_CREATE = 8,
61 NOTIFY_OP_SNAP_REMOVE = 9,
62 NOTIFY_OP_REBUILD_OBJECT_MAP = 10,
63 NOTIFY_OP_SNAP_RENAME = 11,
64 NOTIFY_OP_SNAP_PROTECT = 12,
65 NOTIFY_OP_SNAP_UNPROTECT = 13,
66 NOTIFY_OP_RENAME = 14,
67 NOTIFY_OP_UPDATE_FEATURES = 15,
68};
69
70struct AcquiredLockPayload {
71 static const NotifyOp NOTIFY_OP = NOTIFY_OP_ACQUIRED_LOCK;
72 static const bool CHECK_FOR_REFRESH = false;
73
74 ClientId client_id;
75
76 AcquiredLockPayload() {}
77 AcquiredLockPayload(const ClientId &client_id_) : client_id(client_id_) {}
78
79 void encode(bufferlist &bl) const;
80 void decode(__u8 version, bufferlist::iterator &iter);
81 void dump(Formatter *f) const;
82};
83
84struct ReleasedLockPayload {
85 static const NotifyOp NOTIFY_OP = NOTIFY_OP_RELEASED_LOCK;
86 static const bool CHECK_FOR_REFRESH = false;
87
88 ClientId client_id;
89
90 ReleasedLockPayload() {}
91 ReleasedLockPayload(const ClientId &client_id_) : client_id(client_id_) {}
92
93 void encode(bufferlist &bl) const;
94 void decode(__u8 version, bufferlist::iterator &iter);
95 void dump(Formatter *f) const;
96};
97
98struct RequestLockPayload {
99 static const NotifyOp NOTIFY_OP = NOTIFY_OP_REQUEST_LOCK;
100 static const bool CHECK_FOR_REFRESH = false;
101
102 ClientId client_id;
103 bool force = false;
104
105 RequestLockPayload() {}
106 RequestLockPayload(const ClientId &client_id_, bool force_)
107 : client_id(client_id_), force(force_) {
108 }
109
110 void encode(bufferlist &bl) const;
111 void decode(__u8 version, bufferlist::iterator &iter);
112 void dump(Formatter *f) const;
113};
114
115struct HeaderUpdatePayload {
116 static const NotifyOp NOTIFY_OP = NOTIFY_OP_HEADER_UPDATE;
117 static const bool CHECK_FOR_REFRESH = false;
118
119 void encode(bufferlist &bl) const;
120 void decode(__u8 version, bufferlist::iterator &iter);
121 void dump(Formatter *f) const;
122};
123
124struct AsyncRequestPayloadBase {
125public:
126 AsyncRequestId async_request_id;
127
128 void encode(bufferlist &bl) const;
129 void decode(__u8 version, bufferlist::iterator &iter);
130 void dump(Formatter *f) const;
131
132protected:
133 AsyncRequestPayloadBase() {}
134 AsyncRequestPayloadBase(const AsyncRequestId &id) : async_request_id(id) {}
135};
136
137struct AsyncProgressPayload : public AsyncRequestPayloadBase {
138 static const NotifyOp NOTIFY_OP = NOTIFY_OP_ASYNC_PROGRESS;
139 static const bool CHECK_FOR_REFRESH = false;
140
141 AsyncProgressPayload() : offset(0), total(0) {}
142 AsyncProgressPayload(const AsyncRequestId &id, uint64_t offset_, uint64_t total_)
143 : AsyncRequestPayloadBase(id), offset(offset_), total(total_) {}
144
145 uint64_t offset;
146 uint64_t total;
147
148 void encode(bufferlist &bl) const;
149 void decode(__u8 version, bufferlist::iterator &iter);
150 void dump(Formatter *f) const;
151};
152
153struct AsyncCompletePayload : public AsyncRequestPayloadBase {
154 static const NotifyOp NOTIFY_OP = NOTIFY_OP_ASYNC_COMPLETE;
155 static const bool CHECK_FOR_REFRESH = false;
156
157 AsyncCompletePayload() : result(0) {}
158 AsyncCompletePayload(const AsyncRequestId &id, int r)
159 : AsyncRequestPayloadBase(id), result(r) {}
160
161 int result;
162
163 void encode(bufferlist &bl) const;
164 void decode(__u8 version, bufferlist::iterator &iter);
165 void dump(Formatter *f) const;
166};
167
168struct FlattenPayload : public AsyncRequestPayloadBase {
169 static const NotifyOp NOTIFY_OP = NOTIFY_OP_FLATTEN;
170 static const bool CHECK_FOR_REFRESH = true;
171
172 FlattenPayload() {}
173 FlattenPayload(const AsyncRequestId &id) : AsyncRequestPayloadBase(id) {}
174};
175
176struct ResizePayload : public AsyncRequestPayloadBase {
177 static const NotifyOp NOTIFY_OP = NOTIFY_OP_RESIZE;
178 static const bool CHECK_FOR_REFRESH = true;
179
180 ResizePayload() : size(0), allow_shrink(true) {}
181 ResizePayload(uint64_t size_, bool allow_shrink_, const AsyncRequestId &id)
182 : AsyncRequestPayloadBase(id), size(size_), allow_shrink(allow_shrink_) {}
183
184 uint64_t size;
185 bool allow_shrink;
186
187 void encode(bufferlist &bl) const;
188 void decode(__u8 version, bufferlist::iterator &iter);
189 void dump(Formatter *f) const;
190};
191
192struct SnapPayloadBase {
193public:
194 static const bool CHECK_FOR_REFRESH = true;
195
196 cls::rbd::SnapshotNamespace snap_namespace;
197 std::string snap_name;
198
199 void encode(bufferlist &bl) const;
200 void decode(__u8 version, bufferlist::iterator &iter);
201 void dump(Formatter *f) const;
202
203protected:
204 SnapPayloadBase() {}
205 SnapPayloadBase(const cls::rbd::SnapshotNamespace& _snap_namespace,
206 const std::string &name)
207 : snap_namespace(_snap_namespace), snap_name(name) {}
208};
209
210struct SnapCreatePayload : public SnapPayloadBase {
211 static const NotifyOp NOTIFY_OP = NOTIFY_OP_SNAP_CREATE;
212
213 SnapCreatePayload() {}
214 SnapCreatePayload(const cls::rbd::SnapshotNamespace &_snap_namespace,
215 const std::string &name)
216 : SnapPayloadBase(_snap_namespace, name) {}
217
218 void encode(bufferlist &bl) const;
219 void decode(__u8 version, bufferlist::iterator &iter);
220 void dump(Formatter *f) const;
221};
222
223struct SnapRenamePayload : public SnapPayloadBase {
224 static const NotifyOp NOTIFY_OP = NOTIFY_OP_SNAP_RENAME;
225
226 SnapRenamePayload() {}
227 SnapRenamePayload(const uint64_t &src_snap_id,
228 const std::string &dst_name)
229 : SnapPayloadBase(cls::rbd::UserSnapshotNamespace(), dst_name), snap_id(src_snap_id) {}
230
231 uint64_t snap_id;
232
233 void encode(bufferlist &bl) const;
234 void decode(__u8 version, bufferlist::iterator &iter);
235 void dump(Formatter *f) const;
236};
237
238struct SnapRemovePayload : public SnapPayloadBase {
239 static const NotifyOp NOTIFY_OP = NOTIFY_OP_SNAP_REMOVE;
240
241 SnapRemovePayload() {}
242 SnapRemovePayload(const cls::rbd::SnapshotNamespace& snap_namespace,
243 const std::string &name)
244 : SnapPayloadBase(snap_namespace, name) {}
245};
246
247struct SnapProtectPayload : public SnapPayloadBase {
248 static const NotifyOp NOTIFY_OP = NOTIFY_OP_SNAP_PROTECT;
249
250 SnapProtectPayload() {}
251 SnapProtectPayload(const cls::rbd::SnapshotNamespace& snap_namespace,
252 const std::string &name)
253 : SnapPayloadBase(snap_namespace, name) {}
254};
255
256struct SnapUnprotectPayload : public SnapPayloadBase {
257 static const NotifyOp NOTIFY_OP = NOTIFY_OP_SNAP_UNPROTECT;
258
259 SnapUnprotectPayload() {}
260 SnapUnprotectPayload(const cls::rbd::SnapshotNamespace& snap_namespace,
261 const std::string &name)
262 : SnapPayloadBase(snap_namespace, name) {}
263};
264
265struct RebuildObjectMapPayload : public AsyncRequestPayloadBase {
266 static const NotifyOp NOTIFY_OP = NOTIFY_OP_REBUILD_OBJECT_MAP;
267 static const bool CHECK_FOR_REFRESH = true;
268
269 RebuildObjectMapPayload() {}
270 RebuildObjectMapPayload(const AsyncRequestId &id)
271 : AsyncRequestPayloadBase(id) {}
272};
273
274struct RenamePayload {
275 static const NotifyOp NOTIFY_OP = NOTIFY_OP_RENAME;
276 static const bool CHECK_FOR_REFRESH = true;
277
278 RenamePayload() {}
279 RenamePayload(const std::string _image_name) : image_name(_image_name) {}
280
281 std::string image_name;
282
283 void encode(bufferlist &bl) const;
284 void decode(__u8 version, bufferlist::iterator &iter);
285 void dump(Formatter *f) const;
286};
287
288struct UpdateFeaturesPayload {
289 static const NotifyOp NOTIFY_OP = NOTIFY_OP_UPDATE_FEATURES;
290 static const bool CHECK_FOR_REFRESH = true;
291
292 UpdateFeaturesPayload() : features(0), enabled(false) {}
293 UpdateFeaturesPayload(uint64_t features_, bool enabled_)
294 : features(features_), enabled(enabled_) {}
295
296 uint64_t features;
297 bool enabled;
298
299 void encode(bufferlist &bl) const;
300 void decode(__u8 version, bufferlist::iterator &iter);
301 void dump(Formatter *f) const;
302};
303
304struct UnknownPayload {
305 static const NotifyOp NOTIFY_OP = static_cast<NotifyOp>(-1);
306 static const bool CHECK_FOR_REFRESH = false;
307
308 void encode(bufferlist &bl) const;
309 void decode(__u8 version, bufferlist::iterator &iter);
310 void dump(Formatter *f) const;
311};
312
313typedef boost::variant<AcquiredLockPayload,
314 ReleasedLockPayload,
315 RequestLockPayload,
316 HeaderUpdatePayload,
317 AsyncProgressPayload,
318 AsyncCompletePayload,
319 FlattenPayload,
320 ResizePayload,
321 SnapCreatePayload,
322 SnapRemovePayload,
323 SnapRenamePayload,
324 SnapProtectPayload,
325 SnapUnprotectPayload,
326 RebuildObjectMapPayload,
327 RenamePayload,
328 UpdateFeaturesPayload,
329 UnknownPayload> Payload;
330
331struct NotifyMessage {
332 NotifyMessage() : payload(UnknownPayload()) {}
333 NotifyMessage(const Payload &payload_) : payload(payload_) {}
334
335 Payload payload;
336
337 bool check_for_refresh() const;
338
339 void encode(bufferlist& bl) const;
340 void decode(bufferlist::iterator& it);
341 void dump(Formatter *f) const;
342
343 static void generate_test_instances(std::list<NotifyMessage *> &o);
344};
345
346struct ResponseMessage {
347 ResponseMessage() : result(0) {}
348 ResponseMessage(int result_) : result(result_) {}
349
350 int result;
351
352 void encode(bufferlist& bl) const;
353 void decode(bufferlist::iterator& it);
354 void dump(Formatter *f) const;
355
356 static void generate_test_instances(std::list<ResponseMessage *> &o);
357};
358
359} // namespace watch_notify
360} // namespace librbd
361
362std::ostream &operator<<(std::ostream &out,
363 const librbd::watch_notify::NotifyOp &op);
364std::ostream &operator<<(std::ostream &out,
365 const librbd::watch_notify::AsyncRequestId &request);
366
367WRITE_CLASS_ENCODER(librbd::watch_notify::AsyncRequestId);
368WRITE_CLASS_ENCODER(librbd::watch_notify::NotifyMessage);
369WRITE_CLASS_ENCODER(librbd::watch_notify::ResponseMessage);
370
371#endif // LIBRBD_WATCH_NOTIFY_TYPES_H