]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rbd-mirror: image policy meta types
authorVenky Shankar <vshankar@redhat.com>
Wed, 13 Sep 2017 11:08:03 +0000 (07:08 -0400)
committerVenky Shankar <vshankar@redhat.com>
Mon, 13 Nov 2017 13:27:43 +0000 (08:27 -0500)
Signed-off-by: Venky Shankar <vshankar@redhat.com>
src/test/encoding/types.h
src/tools/rbd_mirror/CMakeLists.txt
src/tools/rbd_mirror/image_map/Types.cc [new file with mode: 0644]
src/tools/rbd_mirror/image_map/Types.h [new file with mode: 0644]

index 5a0f8b7fe8d4f00496f1e0f96e8294e0804695e8..b0ad38acc559c1c4f2d0bd36d2598af8a9a2ed43 100644 (file)
@@ -281,6 +281,9 @@ TYPE(librbd::watch_notify::ResponseMessage)
 #include "rbd_replay/ActionTypes.h"
 TYPE(rbd_replay::action::Dependency)
 TYPE(rbd_replay::action::ActionEntry);
+
+#include "tools/rbd_mirror/image_map/Types.h"
+TYPE(rbd::mirror::image_map::PolicyData)
 #endif
 
 #ifdef WITH_RADOSGW
index 2a558a249a2bc7c0574d7840327b02f713efecd3..63f9110906571c590820791b6ac83551803ad027 100644 (file)
@@ -1,4 +1,5 @@
 add_library(rbd_mirror_types STATIC
+  image_map/Types.cc
   instance_watcher/Types.cc
   leader_watcher/Types.cc)
 
diff --git a/src/tools/rbd_mirror/image_map/Types.cc b/src/tools/rbd_mirror/image_map/Types.cc
new file mode 100644 (file)
index 0000000..02946a8
--- /dev/null
@@ -0,0 +1,110 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+
+#include "Types.h"
+#include "include/assert.h"
+#include "include/stringify.h"
+#include "common/Formatter.h"
+
+namespace rbd {
+namespace mirror {
+namespace image_map {
+
+namespace {
+
+template <typename E>
+class GetTypeVisitor : public boost::static_visitor<E> {
+public:
+  template <typename T>
+  inline E operator()(const T&) const {
+    return T::TYPE;
+  }
+};
+
+class EncodeVisitor : public boost::static_visitor<void> {
+public:
+  explicit EncodeVisitor(bufferlist &bl) : m_bl(bl) {
+  }
+
+  template <typename T>
+  inline void operator()(const T& t) const {
+    ::encode(static_cast<uint32_t>(T::TYPE), m_bl);
+    t.encode(m_bl);
+  }
+private:
+  bufferlist &m_bl;
+};
+
+class DecodeVisitor : public boost::static_visitor<void> {
+public:
+  DecodeVisitor(__u8 version, bufferlist::iterator &iter)
+    : m_version(version), m_iter(iter) {
+  }
+
+  template <typename T>
+  inline void operator()(T& t) const {
+    t.decode(m_version, m_iter);
+  }
+private:
+  __u8 m_version;
+  bufferlist::iterator &m_iter;
+};
+
+class DumpVisitor : public boost::static_visitor<void> {
+public:
+  explicit DumpVisitor(Formatter *formatter, const std::string &key)
+    : m_formatter(formatter), m_key(key) {}
+
+  template <typename T>
+  inline void operator()(const T& t) const {
+    auto type = T::TYPE;
+    m_formatter->dump_string(m_key.c_str(), stringify(type));
+    t.dump(m_formatter);
+  }
+private:
+  ceph::Formatter *m_formatter;
+  std::string m_key;
+};
+
+} // anonymous namespace
+
+PolicyMetaType PolicyData::get_policy_meta_type() const {
+  return boost::apply_visitor(GetTypeVisitor<PolicyMetaType>(), policy_meta);
+}
+
+void PolicyData::encode(bufferlist& bl) const {
+  ENCODE_START(1, 1, bl);
+  boost::apply_visitor(EncodeVisitor(bl), policy_meta);
+  ENCODE_FINISH(bl);
+}
+
+void PolicyData::decode(bufferlist::iterator& it) {
+  DECODE_START(1, it);
+
+  uint32_t policy_meta_type;
+  ::decode(policy_meta_type, it);
+
+  switch (policy_meta_type) {
+  case POLICY_META_TYPE_NONE:
+    policy_meta = PolicyMetaNone();
+    break;
+  default:
+    policy_meta = PolicyMetaUnknown();
+    break;
+  }
+
+  boost::apply_visitor(DecodeVisitor(struct_v, it), policy_meta);
+  DECODE_FINISH(it);
+}
+
+void PolicyData::dump(Formatter *f) const {
+  boost::apply_visitor(DumpVisitor(f, "policy_meta_type"), policy_meta);
+}
+
+void PolicyData::generate_test_instances(std::list<PolicyData *> &o) {
+  o.push_back(new PolicyData(PolicyMetaNone()));
+}
+
+} // namespace image_map
+} // namespace mirror
+} // namespace rbd
diff --git a/src/tools/rbd_mirror/image_map/Types.h b/src/tools/rbd_mirror/image_map/Types.h
new file mode 100644 (file)
index 0000000..7f3cb47
--- /dev/null
@@ -0,0 +1,88 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+
+#ifndef CEPH_RBD_MIRROR_IMAGE_MAP_TYPES_H
+#define CEPH_RBD_MIRROR_IMAGE_MAP_TYPES_H
+
+#include <map>
+#include <string>
+#include <boost/variant.hpp>
+
+#include "include/buffer.h"
+#include "include/encoding.h"
+#include "tools/rbd_mirror/types.h"
+
+namespace ceph {
+class Formatter;
+}
+
+namespace rbd {
+namespace mirror {
+namespace image_map {
+
+enum PolicyMetaType {
+  POLICY_META_TYPE_NONE = 0,
+};
+
+struct PolicyMetaNone {
+  static const PolicyMetaType TYPE = POLICY_META_TYPE_NONE;
+
+  PolicyMetaNone() {
+  }
+
+  void encode(bufferlist& bl) const {
+  }
+
+  void decode(__u8 version, bufferlist::iterator& it) {
+  }
+
+  void dump(Formatter *f) const {
+  }
+};
+
+struct PolicyMetaUnknown {
+  static const PolicyMetaType TYPE = static_cast<PolicyMetaType>(-1);
+
+  PolicyMetaUnknown() {
+  }
+
+  void encode(bufferlist& bl) const {
+    assert(false);
+  }
+
+  void decode(__u8 version, bufferlist::iterator& it) {
+  }
+
+  void dump(Formatter *f) const {
+  }
+};
+
+typedef boost::variant<PolicyMetaNone,
+                       PolicyMetaUnknown> PolicyMeta;
+
+struct PolicyData {
+  PolicyData()
+    : policy_meta(PolicyMetaUnknown()) {
+  }
+  PolicyData(const PolicyMeta &policy_meta)
+    : policy_meta(policy_meta) {
+  }
+
+  PolicyMeta policy_meta;
+
+  PolicyMetaType get_policy_meta_type() const;
+
+  void encode(bufferlist& bl) const;
+  void decode(bufferlist::iterator& it);
+  void dump(Formatter *f) const;
+
+  static void generate_test_instances(std::list<PolicyData *> &o);
+};
+
+} // namespace image_map
+} // namespace mirror
+} // namespace rbd
+
+WRITE_CLASS_ENCODER(rbd::mirror::image_map::PolicyData);
+
+#endif // CEPH_RBD_MIRROR_IMAGE_MAP_TYPES_H