#include "include/ceph_assert.h"
#include "include/stringify.h"
#include "librbd/WatchNotifyTypes.h"
-#include "librbd/watcher/Utils.h"
namespace librbd {
namespace watch_notify {
-namespace {
-
-class CheckForRefreshVisitor : public boost::static_visitor<bool> {
-public:
- template <typename Payload>
- inline bool operator()(const Payload &payload) const {
- return Payload::CHECK_FOR_REFRESH;
- }
-};
-
-class GetNotifyOpVisitor : public boost::static_visitor<NotifyOp> {
-public:
- template <typename Payload>
- NotifyOp operator()(const Payload &payload) const {
- return Payload::NOTIFY_OP;
- }
-};
-
-class DumpPayloadVisitor : public boost::static_visitor<void> {
-public:
- explicit DumpPayloadVisitor(Formatter *formatter) : m_formatter(formatter) {}
-
- template <typename Payload>
- inline void operator()(const Payload &payload) const {
- NotifyOp notify_op = Payload::NOTIFY_OP;
- m_formatter->dump_string("notify_op", stringify(notify_op));
- payload.dump(m_formatter);
- }
-
-private:
- ceph::Formatter *m_formatter;
-};
-
-} // anonymous namespace
-
void AsyncRequestId::encode(bufferlist &bl) const {
using ceph::encode;
encode(client_id, bl);
}
void ResizePayload::dump(Formatter *f) const {
+ AsyncRequestPayloadBase::dump(f);
f->dump_unsigned("size", size);
f->dump_bool("allow_shrink", allow_shrink);
- AsyncRequestPayloadBase::dump(f);
}
void SnapPayloadBase::encode(bufferlist &bl) const {
using ceph::encode;
encode(snap_name, bl);
encode(snap_namespace, bl);
+ encode(async_request_id, bl);
}
void SnapPayloadBase::decode(__u8 version, bufferlist::const_iterator &iter) {
if (version >= 6) {
decode(snap_namespace, iter);
}
+ if (version >= 7) {
+ decode(async_request_id, iter);
+ }
}
void SnapPayloadBase::dump(Formatter *f) const {
+ AsyncRequestPayloadBase::dump(f);
f->dump_string("snap_name", snap_name);
snap_namespace.dump(f);
}
void SnapCreatePayload::encode(bufferlist &bl) const {
+ using ceph::encode;
SnapPayloadBase::encode(bl);
+ encode(flags, bl);
}
void SnapCreatePayload::decode(__u8 version, bufferlist::const_iterator &iter) {
if (version == 5) {
decode(snap_namespace, iter);
}
+ if (version >= 7) {
+ decode(flags, iter);
+ }
}
void SnapCreatePayload::dump(Formatter *f) const {
SnapPayloadBase::dump(f);
+ f->dump_unsigned("flags", flags);
}
void SnapRenamePayload::encode(bufferlist &bl) const {
}
void SnapRenamePayload::dump(Formatter *f) const {
- f->dump_unsigned("src_snap_id", snap_id);
SnapPayloadBase::dump(f);
+ f->dump_unsigned("src_snap_id", snap_id);
}
void RenamePayload::encode(bufferlist &bl) const {
using ceph::encode;
encode(image_name, bl);
+ encode(async_request_id, bl);
}
void RenamePayload::decode(__u8 version, bufferlist::const_iterator &iter) {
using ceph::decode;
decode(image_name, iter);
+ if (version >= 7) {
+ decode(async_request_id, iter);
+ }
}
void RenamePayload::dump(Formatter *f) const {
+ AsyncRequestPayloadBase::dump(f);
f->dump_string("image_name", image_name);
}
using ceph::encode;
encode(features, bl);
encode(enabled, bl);
+ encode(async_request_id, bl);
}
void UpdateFeaturesPayload::decode(__u8 version, bufferlist::const_iterator &iter) {
using ceph::decode;
decode(features, iter);
decode(enabled, iter);
+ if (version >= 7) {
+ decode(async_request_id, iter);
+ }
}
void UpdateFeaturesPayload::dump(Formatter *f) const {
+ AsyncRequestPayloadBase::dump(f);
f->dump_unsigned("features", features);
f->dump_bool("enabled", enabled);
}
f->dump_unsigned("sparse_size", sparse_size);
}
+void MetadataUpdatePayload::encode(bufferlist &bl) const {
+ using ceph::encode;
+ encode(key, bl);
+ encode(value, bl);
+ encode(async_request_id, bl);
+}
+
+void MetadataUpdatePayload::decode(__u8 version, bufferlist::const_iterator &iter) {
+ using ceph::decode;
+ decode(key, iter);
+ decode(value, iter);
+ if (version >= 7) {
+ decode(async_request_id, iter);
+ }
+}
+
+void MetadataUpdatePayload::dump(Formatter *f) const {
+ AsyncRequestPayloadBase::dump(f);
+ f->dump_string("key", key);
+ f->dump_string("value", *value);
+}
+
void UnknownPayload::encode(bufferlist &bl) const {
ceph_abort();
}
}
bool NotifyMessage::check_for_refresh() const {
- return boost::apply_visitor(CheckForRefreshVisitor(), payload);
+ return payload->check_for_refresh();
}
void NotifyMessage::encode(bufferlist& bl) const {
- ENCODE_START(6, 1, bl);
- boost::apply_visitor(watcher::util::EncodePayloadVisitor(bl), payload);
+ ENCODE_START(7, 1, bl);
+ encode(static_cast<uint32_t>(payload->get_notify_op()), bl);
+ payload->encode(bl);
ENCODE_FINISH(bl);
}
// select the correct payload variant based upon the encoded op
switch (notify_op) {
case NOTIFY_OP_ACQUIRED_LOCK:
- payload = AcquiredLockPayload();
+ payload.reset(new AcquiredLockPayload());
break;
case NOTIFY_OP_RELEASED_LOCK:
- payload = ReleasedLockPayload();
+ payload.reset(new ReleasedLockPayload());
break;
case NOTIFY_OP_REQUEST_LOCK:
- payload = RequestLockPayload();
+ payload.reset(new RequestLockPayload());
break;
case NOTIFY_OP_HEADER_UPDATE:
- payload = HeaderUpdatePayload();
+ payload.reset(new HeaderUpdatePayload());
break;
case NOTIFY_OP_ASYNC_PROGRESS:
- payload = AsyncProgressPayload();
+ payload.reset(new AsyncProgressPayload());
break;
case NOTIFY_OP_ASYNC_COMPLETE:
- payload = AsyncCompletePayload();
+ payload.reset(new AsyncCompletePayload());
break;
case NOTIFY_OP_FLATTEN:
- payload = FlattenPayload();
+ payload.reset(new FlattenPayload());
break;
case NOTIFY_OP_RESIZE:
- payload = ResizePayload();
+ payload.reset(new ResizePayload());
break;
case NOTIFY_OP_SNAP_CREATE:
- payload = SnapCreatePayload();
+ payload.reset(new SnapCreatePayload());
break;
case NOTIFY_OP_SNAP_REMOVE:
- payload = SnapRemovePayload();
+ payload.reset(new SnapRemovePayload());
break;
case NOTIFY_OP_SNAP_RENAME:
- payload = SnapRenamePayload();
+ payload.reset(new SnapRenamePayload());
break;
case NOTIFY_OP_SNAP_PROTECT:
- payload = SnapProtectPayload();
+ payload.reset(new SnapProtectPayload());
break;
case NOTIFY_OP_SNAP_UNPROTECT:
- payload = SnapUnprotectPayload();
+ payload.reset(new SnapUnprotectPayload());
break;
case NOTIFY_OP_REBUILD_OBJECT_MAP:
- payload = RebuildObjectMapPayload();
+ payload.reset(new RebuildObjectMapPayload());
break;
case NOTIFY_OP_RENAME:
- payload = RenamePayload();
+ payload.reset(new RenamePayload());
break;
case NOTIFY_OP_UPDATE_FEATURES:
- payload = UpdateFeaturesPayload();
+ payload.reset(new UpdateFeaturesPayload());
break;
case NOTIFY_OP_MIGRATE:
- payload = MigratePayload();
+ payload.reset(new MigratePayload());
break;
case NOTIFY_OP_SPARSIFY:
- payload = SparsifyPayload();
+ payload.reset(new SparsifyPayload());
break;
- default:
- payload = UnknownPayload();
+ case NOTIFY_OP_QUIESCE:
+ payload.reset(new QuiescePayload());
+ break;
+ case NOTIFY_OP_UNQUIESCE:
+ payload.reset(new UnquiescePayload());
+ break;
+ case NOTIFY_OP_METADATA_UPDATE:
+ payload.reset(new MetadataUpdatePayload());
break;
}
- apply_visitor(watcher::util::DecodePayloadVisitor(struct_v, iter), payload);
+ payload->decode(struct_v, iter);
DECODE_FINISH(iter);
}
void NotifyMessage::dump(Formatter *f) const {
- apply_visitor(DumpPayloadVisitor(f), payload);
+ payload->dump(f);
}
NotifyOp NotifyMessage::get_notify_op() const {
- return apply_visitor(GetNotifyOpVisitor(), payload);
+ return payload->get_notify_op();
}
void NotifyMessage::generate_test_instances(std::list<NotifyMessage *> &o) {
- o.push_back(new NotifyMessage(AcquiredLockPayload(ClientId(1, 2))));
- o.push_back(new NotifyMessage(ReleasedLockPayload(ClientId(1, 2))));
- o.push_back(new NotifyMessage(RequestLockPayload(ClientId(1, 2), true)));
- o.push_back(new NotifyMessage(HeaderUpdatePayload()));
- o.push_back(new NotifyMessage(AsyncProgressPayload(AsyncRequestId(ClientId(0, 1), 2), 3, 4)));
- o.push_back(new NotifyMessage(AsyncCompletePayload(AsyncRequestId(ClientId(0, 1), 2), 3)));
- o.push_back(new NotifyMessage(FlattenPayload(AsyncRequestId(ClientId(0, 1), 2))));
- o.push_back(new NotifyMessage(ResizePayload(123, true, AsyncRequestId(ClientId(0, 1), 2))));
- o.push_back(new NotifyMessage(SnapCreatePayload(cls::rbd::UserSnapshotNamespace(),
- "foo")));
- o.push_back(new NotifyMessage(SnapRemovePayload(cls::rbd::UserSnapshotNamespace(), "foo")));
- o.push_back(new NotifyMessage(SnapProtectPayload(cls::rbd::UserSnapshotNamespace(), "foo")));
- o.push_back(new NotifyMessage(SnapUnprotectPayload(cls::rbd::UserSnapshotNamespace(), "foo")));
- o.push_back(new NotifyMessage(RebuildObjectMapPayload(AsyncRequestId(ClientId(0, 1), 2))));
- o.push_back(new NotifyMessage(RenamePayload("foo")));
- o.push_back(new NotifyMessage(UpdateFeaturesPayload(1, true)));
- o.push_back(new NotifyMessage(MigratePayload(AsyncRequestId(ClientId(0, 1), 2))));
- o.push_back(new NotifyMessage(SparsifyPayload(AsyncRequestId(ClientId(0, 1), 2), 1)));
+ o.push_back(new NotifyMessage(new AcquiredLockPayload(ClientId(1, 2))));
+ o.push_back(new NotifyMessage(new ReleasedLockPayload(ClientId(1, 2))));
+ o.push_back(new NotifyMessage(new RequestLockPayload(ClientId(1, 2), true)));
+ o.push_back(new NotifyMessage(new HeaderUpdatePayload()));
+ o.push_back(new NotifyMessage(new AsyncProgressPayload(AsyncRequestId(ClientId(0, 1), 2), 3, 4)));
+ o.push_back(new NotifyMessage(new AsyncCompletePayload(AsyncRequestId(ClientId(0, 1), 2), 3)));
+ o.push_back(new NotifyMessage(new FlattenPayload(AsyncRequestId(ClientId(0, 1), 2))));
+ o.push_back(new NotifyMessage(new ResizePayload(AsyncRequestId(ClientId(0, 1), 2), 123, true)));
+ o.push_back(new NotifyMessage(new SnapCreatePayload(AsyncRequestId(ClientId(0, 1), 2),
+ cls::rbd::UserSnapshotNamespace(),
+ "foo", 1)));
+ o.push_back(new NotifyMessage(new SnapRemovePayload(AsyncRequestId(ClientId(0, 1), 2),
+ cls::rbd::UserSnapshotNamespace(), "foo")));
+ o.push_back(new NotifyMessage(new SnapProtectPayload(AsyncRequestId(ClientId(0, 1), 2),
+ cls::rbd::UserSnapshotNamespace(), "foo")));
+ o.push_back(new NotifyMessage(new SnapUnprotectPayload(AsyncRequestId(ClientId(0, 1), 2),
+ cls::rbd::UserSnapshotNamespace(), "foo")));
+ o.push_back(new NotifyMessage(new RebuildObjectMapPayload(AsyncRequestId(ClientId(0, 1), 2))));
+ o.push_back(new NotifyMessage(new RenamePayload(AsyncRequestId(ClientId(0, 1), 2), "foo")));
+ o.push_back(new NotifyMessage(new UpdateFeaturesPayload(AsyncRequestId(ClientId(0, 1), 2),
+ 1, true)));
+ o.push_back(new NotifyMessage(new MigratePayload(AsyncRequestId(ClientId(0, 1), 2))));
+ o.push_back(new NotifyMessage(new SparsifyPayload(AsyncRequestId(ClientId(0, 1), 2), 1)));
+ o.push_back(new NotifyMessage(new QuiescePayload(AsyncRequestId(ClientId(0, 1), 2))));
+ o.push_back(new NotifyMessage(new UnquiescePayload(AsyncRequestId(ClientId(0, 1), 2))));
+ o.push_back(new NotifyMessage(new MetadataUpdatePayload(AsyncRequestId(ClientId(0, 1), 2),
+ "foo", std::optional<std::string>{"xyz"})));
}
void ResponseMessage::encode(bufferlist& bl) const {
case NOTIFY_OP_SPARSIFY:
out << "Sparsify";
break;
+ case NOTIFY_OP_QUIESCE:
+ out << "Quiesce";
+ break;
+ case NOTIFY_OP_UNQUIESCE:
+ out << "Unquiesce";
+ break;
+ case NOTIFY_OP_METADATA_UPDATE:
+ out << "MetadataUpdate";
+ break;
default:
out << "Unknown (" << static_cast<uint32_t>(op) << ")";
break;