]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/librbd/WatchNotifyTypes.cc
update source to Ceph Pacific 16.2.2
[ceph.git] / ceph / src / librbd / WatchNotifyTypes.cc
index 2ed85f78df8e3d1413c7a13efb71cd84ad8d4ebf..413983f3e6377de1be9640ee977eb226018db1f6 100644 (file)
@@ -6,46 +6,10 @@
 #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);
@@ -204,15 +168,16 @@ void ResizePayload::decode(__u8 version, bufferlist::const_iterator &iter) {
 }
 
 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) {
@@ -221,15 +186,21 @@ 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) {
@@ -238,10 +209,14 @@ 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 {
@@ -257,21 +232,26 @@ void SnapRenamePayload::decode(__u8 version, bufferlist::const_iterator &iter) {
 }
 
 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);
 }
 
@@ -279,15 +259,20 @@ void UpdateFeaturesPayload::encode(bufferlist &bl) const {
   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);
 }
@@ -309,6 +294,28 @@ void SparsifyPayload::dump(Formatter *f) const {
   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();
 }
@@ -320,12 +327,13 @@ void UnknownPayload::dump(Formatter *f) const {
 }
 
 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);
 }
 
@@ -338,95 +346,110 @@ void NotifyMessage::decode(bufferlist::const_iterator& iter) {
   // 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 {
@@ -508,6 +531,15 @@ std::ostream &operator<<(std::ostream &out,
   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;