1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 #include "cls/rbd/cls_rbd_types.h"
5 #include "common/Formatter.h"
6 #include "include/ceph_assert.h"
7 #include "include/stringify.h"
8 #include "librbd/WatchNotifyTypes.h"
11 namespace watch_notify
{
13 void AsyncRequestId::encode(bufferlist
&bl
) const {
15 encode(client_id
, bl
);
16 encode(request_id
, bl
);
19 void AsyncRequestId::decode(bufferlist::const_iterator
&iter
) {
21 decode(client_id
, iter
);
22 decode(request_id
, iter
);
25 void AsyncRequestId::dump(Formatter
*f
) const {
26 f
->open_object_section("client_id");
29 f
->dump_unsigned("request_id", request_id
);
32 void AcquiredLockPayload::encode(bufferlist
&bl
) const {
34 encode(client_id
, bl
);
37 void AcquiredLockPayload::decode(__u8 version
, bufferlist::const_iterator
&iter
) {
40 decode(client_id
, iter
);
44 void AcquiredLockPayload::dump(Formatter
*f
) const {
45 f
->open_object_section("client_id");
50 void ReleasedLockPayload::encode(bufferlist
&bl
) const {
52 encode(client_id
, bl
);
55 void ReleasedLockPayload::decode(__u8 version
, bufferlist::const_iterator
&iter
) {
58 decode(client_id
, iter
);
62 void ReleasedLockPayload::dump(Formatter
*f
) const {
63 f
->open_object_section("client_id");
68 void RequestLockPayload::encode(bufferlist
&bl
) const {
70 encode(client_id
, bl
);
74 void RequestLockPayload::decode(__u8 version
, bufferlist::const_iterator
&iter
) {
77 decode(client_id
, iter
);
84 void RequestLockPayload::dump(Formatter
*f
) const {
85 f
->open_object_section("client_id");
88 f
->dump_bool("force", force
);
91 void HeaderUpdatePayload::encode(bufferlist
&bl
) const {
94 void HeaderUpdatePayload::decode(__u8 version
, bufferlist::const_iterator
&iter
) {
97 void HeaderUpdatePayload::dump(Formatter
*f
) const {
100 void AsyncRequestPayloadBase::encode(bufferlist
&bl
) const {
102 encode(async_request_id
, bl
);
105 void AsyncRequestPayloadBase::decode(__u8 version
, bufferlist::const_iterator
&iter
) {
107 decode(async_request_id
, iter
);
110 void AsyncRequestPayloadBase::dump(Formatter
*f
) const {
111 f
->open_object_section("async_request_id");
112 async_request_id
.dump(f
);
116 void AsyncProgressPayload::encode(bufferlist
&bl
) const {
118 AsyncRequestPayloadBase::encode(bl
);
123 void AsyncProgressPayload::decode(__u8 version
, bufferlist::const_iterator
&iter
) {
125 AsyncRequestPayloadBase::decode(version
, iter
);
126 decode(offset
, iter
);
130 void AsyncProgressPayload::dump(Formatter
*f
) const {
131 AsyncRequestPayloadBase::dump(f
);
132 f
->dump_unsigned("offset", offset
);
133 f
->dump_unsigned("total", total
);
136 void AsyncCompletePayload::encode(bufferlist
&bl
) const {
138 AsyncRequestPayloadBase::encode(bl
);
142 void AsyncCompletePayload::decode(__u8 version
, bufferlist::const_iterator
&iter
) {
144 AsyncRequestPayloadBase::decode(version
, iter
);
145 decode(result
, iter
);
148 void AsyncCompletePayload::dump(Formatter
*f
) const {
149 AsyncRequestPayloadBase::dump(f
);
150 f
->dump_int("result", result
);
153 void ResizePayload::encode(bufferlist
&bl
) const {
156 AsyncRequestPayloadBase::encode(bl
);
157 encode(allow_shrink
, bl
);
160 void ResizePayload::decode(__u8 version
, bufferlist::const_iterator
&iter
) {
163 AsyncRequestPayloadBase::decode(version
, iter
);
166 decode(allow_shrink
, iter
);
170 void ResizePayload::dump(Formatter
*f
) const {
171 AsyncRequestPayloadBase::dump(f
);
172 f
->dump_unsigned("size", size
);
173 f
->dump_bool("allow_shrink", allow_shrink
);
176 void SnapPayloadBase::encode(bufferlist
&bl
) const {
178 encode(snap_name
, bl
);
179 encode(snap_namespace
, bl
);
180 encode(async_request_id
, bl
);
183 void SnapPayloadBase::decode(__u8 version
, bufferlist::const_iterator
&iter
) {
185 decode(snap_name
, iter
);
187 decode(snap_namespace
, iter
);
190 decode(async_request_id
, iter
);
194 void SnapPayloadBase::dump(Formatter
*f
) const {
195 AsyncRequestPayloadBase::dump(f
);
196 f
->dump_string("snap_name", snap_name
);
197 snap_namespace
.dump(f
);
200 void SnapCreatePayload::encode(bufferlist
&bl
) const {
202 SnapPayloadBase::encode(bl
);
206 void SnapCreatePayload::decode(__u8 version
, bufferlist::const_iterator
&iter
) {
208 SnapPayloadBase::decode(version
, iter
);
210 decode(snap_namespace
, iter
);
217 void SnapCreatePayload::dump(Formatter
*f
) const {
218 SnapPayloadBase::dump(f
);
219 f
->dump_unsigned("flags", flags
);
222 void SnapRenamePayload::encode(bufferlist
&bl
) const {
225 SnapPayloadBase::encode(bl
);
228 void SnapRenamePayload::decode(__u8 version
, bufferlist::const_iterator
&iter
) {
230 decode(snap_id
, iter
);
231 SnapPayloadBase::decode(version
, iter
);
234 void SnapRenamePayload::dump(Formatter
*f
) const {
235 SnapPayloadBase::dump(f
);
236 f
->dump_unsigned("src_snap_id", snap_id
);
239 void RenamePayload::encode(bufferlist
&bl
) const {
241 encode(image_name
, bl
);
242 encode(async_request_id
, bl
);
245 void RenamePayload::decode(__u8 version
, bufferlist::const_iterator
&iter
) {
247 decode(image_name
, iter
);
249 decode(async_request_id
, iter
);
253 void RenamePayload::dump(Formatter
*f
) const {
254 AsyncRequestPayloadBase::dump(f
);
255 f
->dump_string("image_name", image_name
);
258 void UpdateFeaturesPayload::encode(bufferlist
&bl
) const {
260 encode(features
, bl
);
262 encode(async_request_id
, bl
);
265 void UpdateFeaturesPayload::decode(__u8 version
, bufferlist::const_iterator
&iter
) {
267 decode(features
, iter
);
268 decode(enabled
, iter
);
270 decode(async_request_id
, iter
);
274 void UpdateFeaturesPayload::dump(Formatter
*f
) const {
275 AsyncRequestPayloadBase::dump(f
);
276 f
->dump_unsigned("features", features
);
277 f
->dump_bool("enabled", enabled
);
280 void SparsifyPayload::encode(bufferlist
&bl
) const {
282 AsyncRequestPayloadBase::encode(bl
);
283 encode(sparse_size
, bl
);
286 void SparsifyPayload::decode(__u8 version
, bufferlist::const_iterator
&iter
) {
288 AsyncRequestPayloadBase::decode(version
, iter
);
289 decode(sparse_size
, iter
);
292 void SparsifyPayload::dump(Formatter
*f
) const {
293 AsyncRequestPayloadBase::dump(f
);
294 f
->dump_unsigned("sparse_size", sparse_size
);
297 void MetadataUpdatePayload::encode(bufferlist
&bl
) const {
301 encode(async_request_id
, bl
);
304 void MetadataUpdatePayload::decode(__u8 version
, bufferlist::const_iterator
&iter
) {
309 decode(async_request_id
, iter
);
313 void MetadataUpdatePayload::dump(Formatter
*f
) const {
314 AsyncRequestPayloadBase::dump(f
);
315 f
->dump_string("key", key
);
316 f
->dump_string("value", *value
);
319 void UnknownPayload::encode(bufferlist
&bl
) const {
323 void UnknownPayload::decode(__u8 version
, bufferlist::const_iterator
&iter
) {
326 void UnknownPayload::dump(Formatter
*f
) const {
329 bool NotifyMessage::check_for_refresh() const {
330 return payload
->check_for_refresh();
333 void NotifyMessage::encode(bufferlist
& bl
) const {
334 ENCODE_START(7, 1, bl
);
335 encode(static_cast<uint32_t>(payload
->get_notify_op()), bl
);
340 void NotifyMessage::decode(bufferlist::const_iterator
& iter
) {
341 DECODE_START(1, iter
);
344 decode(notify_op
, iter
);
346 // select the correct payload variant based upon the encoded op
348 case NOTIFY_OP_ACQUIRED_LOCK
:
349 payload
.reset(new AcquiredLockPayload());
351 case NOTIFY_OP_RELEASED_LOCK
:
352 payload
.reset(new ReleasedLockPayload());
354 case NOTIFY_OP_REQUEST_LOCK
:
355 payload
.reset(new RequestLockPayload());
357 case NOTIFY_OP_HEADER_UPDATE
:
358 payload
.reset(new HeaderUpdatePayload());
360 case NOTIFY_OP_ASYNC_PROGRESS
:
361 payload
.reset(new AsyncProgressPayload());
363 case NOTIFY_OP_ASYNC_COMPLETE
:
364 payload
.reset(new AsyncCompletePayload());
366 case NOTIFY_OP_FLATTEN
:
367 payload
.reset(new FlattenPayload());
369 case NOTIFY_OP_RESIZE
:
370 payload
.reset(new ResizePayload());
372 case NOTIFY_OP_SNAP_CREATE
:
373 payload
.reset(new SnapCreatePayload());
375 case NOTIFY_OP_SNAP_REMOVE
:
376 payload
.reset(new SnapRemovePayload());
378 case NOTIFY_OP_SNAP_RENAME
:
379 payload
.reset(new SnapRenamePayload());
381 case NOTIFY_OP_SNAP_PROTECT
:
382 payload
.reset(new SnapProtectPayload());
384 case NOTIFY_OP_SNAP_UNPROTECT
:
385 payload
.reset(new SnapUnprotectPayload());
387 case NOTIFY_OP_REBUILD_OBJECT_MAP
:
388 payload
.reset(new RebuildObjectMapPayload());
390 case NOTIFY_OP_RENAME
:
391 payload
.reset(new RenamePayload());
393 case NOTIFY_OP_UPDATE_FEATURES
:
394 payload
.reset(new UpdateFeaturesPayload());
396 case NOTIFY_OP_MIGRATE
:
397 payload
.reset(new MigratePayload());
399 case NOTIFY_OP_SPARSIFY
:
400 payload
.reset(new SparsifyPayload());
402 case NOTIFY_OP_QUIESCE
:
403 payload
.reset(new QuiescePayload());
405 case NOTIFY_OP_UNQUIESCE
:
406 payload
.reset(new UnquiescePayload());
408 case NOTIFY_OP_METADATA_UPDATE
:
409 payload
.reset(new MetadataUpdatePayload());
413 payload
->decode(struct_v
, iter
);
417 void NotifyMessage::dump(Formatter
*f
) const {
421 NotifyOp
NotifyMessage::get_notify_op() const {
422 return payload
->get_notify_op();
425 void NotifyMessage::generate_test_instances(std::list
<NotifyMessage
*> &o
) {
426 o
.push_back(new NotifyMessage(new AcquiredLockPayload(ClientId(1, 2))));
427 o
.push_back(new NotifyMessage(new ReleasedLockPayload(ClientId(1, 2))));
428 o
.push_back(new NotifyMessage(new RequestLockPayload(ClientId(1, 2), true)));
429 o
.push_back(new NotifyMessage(new HeaderUpdatePayload()));
430 o
.push_back(new NotifyMessage(new AsyncProgressPayload(AsyncRequestId(ClientId(0, 1), 2), 3, 4)));
431 o
.push_back(new NotifyMessage(new AsyncCompletePayload(AsyncRequestId(ClientId(0, 1), 2), 3)));
432 o
.push_back(new NotifyMessage(new FlattenPayload(AsyncRequestId(ClientId(0, 1), 2))));
433 o
.push_back(new NotifyMessage(new ResizePayload(AsyncRequestId(ClientId(0, 1), 2), 123, true)));
434 o
.push_back(new NotifyMessage(new SnapCreatePayload(AsyncRequestId(ClientId(0, 1), 2),
435 cls::rbd::UserSnapshotNamespace(),
437 o
.push_back(new NotifyMessage(new SnapRemovePayload(AsyncRequestId(ClientId(0, 1), 2),
438 cls::rbd::UserSnapshotNamespace(), "foo")));
439 o
.push_back(new NotifyMessage(new SnapProtectPayload(AsyncRequestId(ClientId(0, 1), 2),
440 cls::rbd::UserSnapshotNamespace(), "foo")));
441 o
.push_back(new NotifyMessage(new SnapUnprotectPayload(AsyncRequestId(ClientId(0, 1), 2),
442 cls::rbd::UserSnapshotNamespace(), "foo")));
443 o
.push_back(new NotifyMessage(new RebuildObjectMapPayload(AsyncRequestId(ClientId(0, 1), 2))));
444 o
.push_back(new NotifyMessage(new RenamePayload(AsyncRequestId(ClientId(0, 1), 2), "foo")));
445 o
.push_back(new NotifyMessage(new UpdateFeaturesPayload(AsyncRequestId(ClientId(0, 1), 2),
447 o
.push_back(new NotifyMessage(new MigratePayload(AsyncRequestId(ClientId(0, 1), 2))));
448 o
.push_back(new NotifyMessage(new SparsifyPayload(AsyncRequestId(ClientId(0, 1), 2), 1)));
449 o
.push_back(new NotifyMessage(new QuiescePayload(AsyncRequestId(ClientId(0, 1), 2))));
450 o
.push_back(new NotifyMessage(new UnquiescePayload(AsyncRequestId(ClientId(0, 1), 2))));
451 o
.push_back(new NotifyMessage(new MetadataUpdatePayload(AsyncRequestId(ClientId(0, 1), 2),
452 "foo", std::optional
<std::string
>{"xyz"})));
455 void ResponseMessage::encode(bufferlist
& bl
) const {
456 ENCODE_START(1, 1, bl
);
461 void ResponseMessage::decode(bufferlist::const_iterator
& iter
) {
462 DECODE_START(1, iter
);
463 decode(result
, iter
);
467 void ResponseMessage::dump(Formatter
*f
) const {
468 f
->dump_int("result", result
);
471 void ResponseMessage::generate_test_instances(std::list
<ResponseMessage
*> &o
) {
472 o
.push_back(new ResponseMessage(1));
475 std::ostream
&operator<<(std::ostream
&out
,
476 const librbd::watch_notify::NotifyOp
&op
) {
477 using namespace librbd::watch_notify
;
480 case NOTIFY_OP_ACQUIRED_LOCK
:
481 out
<< "AcquiredLock";
483 case NOTIFY_OP_RELEASED_LOCK
:
484 out
<< "ReleasedLock";
486 case NOTIFY_OP_REQUEST_LOCK
:
487 out
<< "RequestLock";
489 case NOTIFY_OP_HEADER_UPDATE
:
490 out
<< "HeaderUpdate";
492 case NOTIFY_OP_ASYNC_PROGRESS
:
493 out
<< "AsyncProgress";
495 case NOTIFY_OP_ASYNC_COMPLETE
:
496 out
<< "AsyncComplete";
498 case NOTIFY_OP_FLATTEN
:
501 case NOTIFY_OP_RESIZE
:
504 case NOTIFY_OP_SNAP_CREATE
:
507 case NOTIFY_OP_SNAP_REMOVE
:
510 case NOTIFY_OP_SNAP_RENAME
:
513 case NOTIFY_OP_SNAP_PROTECT
:
514 out
<< "SnapProtect";
516 case NOTIFY_OP_SNAP_UNPROTECT
:
517 out
<< "SnapUnprotect";
519 case NOTIFY_OP_REBUILD_OBJECT_MAP
:
520 out
<< "RebuildObjectMap";
522 case NOTIFY_OP_RENAME
:
525 case NOTIFY_OP_UPDATE_FEATURES
:
526 out
<< "UpdateFeatures";
528 case NOTIFY_OP_MIGRATE
:
531 case NOTIFY_OP_SPARSIFY
:
534 case NOTIFY_OP_QUIESCE
:
537 case NOTIFY_OP_UNQUIESCE
:
540 case NOTIFY_OP_METADATA_UPDATE
:
541 out
<< "MetadataUpdate";
544 out
<< "Unknown (" << static_cast<uint32_t>(op
) << ")";
550 std::ostream
&operator<<(std::ostream
&out
,
551 const librbd::watch_notify::AsyncRequestId
&request
) {
552 out
<< "[" << request
.client_id
.gid
<< "," << request
.client_id
.handle
<< ","
553 << request
.request_id
<< "]";
556 } // namespace watch_notify
557 } // namespace librbd