initial code repo
[stor4nfv.git] / src / ceph / src / librbd / watcher / Types.h
diff --git a/src/ceph/src/librbd/watcher/Types.h b/src/ceph/src/librbd/watcher/Types.h
new file mode 100644 (file)
index 0000000..e7886f6
--- /dev/null
@@ -0,0 +1,71 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+
+#ifndef CEPH_LIBRBD_WATCHER_TYPES_H
+#define CEPH_LIBRBD_WATCHER_TYPES_H
+
+#include "include/int_types.h"
+#include "include/buffer_fwd.h"
+#include "include/encoding.h"
+
+namespace ceph { class Formatter; }
+
+namespace librbd {
+
+class Watcher;
+
+namespace watcher {
+
+struct ClientId {
+  uint64_t gid;
+  uint64_t handle;
+
+  ClientId() : gid(0), handle(0) {}
+  ClientId(uint64_t gid, uint64_t handle) : gid(gid), handle(handle) {}
+
+  void encode(bufferlist& bl) const;
+  void decode(bufferlist::iterator& it);
+  void dump(Formatter *f) const;
+
+  inline bool is_valid() const {
+    return (*this != ClientId());
+  }
+
+  inline bool operator==(const ClientId &rhs) const {
+    return (gid == rhs.gid && handle == rhs.handle);
+  }
+  inline bool operator!=(const ClientId &rhs) const {
+    return !(*this == rhs);
+  }
+  inline bool operator<(const ClientId &rhs) const {
+    if (gid != rhs.gid) {
+      return gid < rhs.gid;
+    } else {
+      return handle < rhs.handle;
+    }
+  }
+};
+
+struct NotifyResponse {
+  std::map<ClientId, bufferlist> acks;
+  std::vector<ClientId> timeouts;
+
+  void encode(bufferlist& bl) const;
+  void decode(bufferlist::iterator& it);
+};
+
+template <typename ImageCtxT>
+struct Traits {
+  typedef librbd::Watcher Watcher;
+};
+
+} // namespace watcher
+} // namespace librbd
+
+std::ostream &operator<<(std::ostream &out,
+                         const librbd::watcher::ClientId &client);
+
+WRITE_CLASS_ENCODER(librbd::watcher::ClientId);
+WRITE_CLASS_ENCODER(librbd::watcher::NotifyResponse);
+
+#endif // CEPH_LIBRBD_WATCHER_TYPES_H