initial code repo
[stor4nfv.git] / src / ceph / src / test / librados_test_stub / TestWatchNotify.h
diff --git a/src/ceph/src/test/librados_test_stub/TestWatchNotify.h b/src/ceph/src/test/librados_test_stub/TestWatchNotify.h
new file mode 100644 (file)
index 0000000..baf56cb
--- /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
+
+#ifndef CEPH_TEST_WATCH_NOTIFY_H
+#define CEPH_TEST_WATCH_NOTIFY_H
+
+#include "include/rados/librados.hpp"
+#include "common/Cond.h"
+#include "common/Mutex.h"
+#include <boost/noncopyable.hpp>
+#include <boost/shared_ptr.hpp>
+#include <list>
+#include <map>
+
+class Cond;
+class Finisher;
+
+namespace librados {
+
+class TestRadosClient;
+
+class TestWatchNotify : boost::noncopyable {
+public:
+  typedef std::pair<uint64_t, uint64_t> WatcherID;
+  typedef std::set<WatcherID> WatcherIDs;
+  typedef std::map<std::pair<uint64_t, uint64_t>, bufferlist> NotifyResponses;
+
+  struct NotifyHandle {
+    TestRadosClient *rados_client = nullptr;
+    WatcherIDs pending_watcher_ids;
+    NotifyResponses notify_responses;
+    bufferlist *pbl = nullptr;
+    Context *on_notify = nullptr;
+  };
+  typedef boost::shared_ptr<NotifyHandle> SharedNotifyHandle;
+  typedef std::map<uint64_t, SharedNotifyHandle> NotifyHandles;
+
+  struct WatchHandle {
+    TestRadosClient *rados_client = nullptr;
+    std::string addr;
+    uint32_t nonce;
+    uint64_t gid;
+    uint64_t handle;
+    librados::WatchCtx* watch_ctx;
+    librados::WatchCtx2* watch_ctx2;
+  };
+
+  typedef std::map<uint64_t, WatchHandle> WatchHandles;
+
+  struct Watcher {
+    WatchHandles watch_handles;
+    NotifyHandles notify_handles;
+  };
+  typedef boost::shared_ptr<Watcher> SharedWatcher;
+
+  TestWatchNotify();
+
+  int list_watchers(const std::string& o,
+                    std::list<obj_watch_t> *out_watchers);
+
+  void aio_flush(TestRadosClient *rados_client, Context *on_finish);
+  void aio_watch(TestRadosClient *rados_client, const std::string& o,
+                 uint64_t gid, uint64_t *handle, librados::WatchCtx2 *watch_ctx,
+                 Context *on_finish);
+  void aio_unwatch(TestRadosClient *rados_client, uint64_t handle,
+                   Context *on_finish);
+  void aio_notify(TestRadosClient *rados_client, const std::string& oid,
+                  bufferlist& bl, uint64_t timeout_ms, bufferlist *pbl,
+                  Context *on_notify);
+
+  void flush(TestRadosClient *rados_client);
+  int notify(TestRadosClient *rados_client, const std::string& o,
+             bufferlist& bl, uint64_t timeout_ms, bufferlist *pbl);
+  void notify_ack(TestRadosClient *rados_client, const std::string& o,
+                  uint64_t notify_id, uint64_t handle, uint64_t gid,
+                  bufferlist& bl);
+  int watch(TestRadosClient *rados_client, const std::string& o, uint64_t gid,
+            uint64_t *handle, librados::WatchCtx *ctx,
+            librados::WatchCtx2 *ctx2);
+  int unwatch(TestRadosClient *rados_client, uint64_t handle);
+
+  void blacklist(uint32_t nonce);
+
+private:
+
+  typedef std::map<std::string, SharedWatcher> FileWatchers;
+
+  uint64_t m_handle = 0;
+  uint64_t m_notify_id = 0;
+
+  Mutex m_lock;
+  uint64_t m_pending_notifies = 0;
+
+  Cond m_file_watcher_cond;
+  FileWatchers m_file_watchers;
+
+  SharedWatcher get_watcher(const std::string& oid);
+
+  void execute_notify(TestRadosClient *rados_client, const std::string &oid,
+                      bufferlist &bl, uint64_t notify_id);
+  void ack_notify(TestRadosClient *rados_client, const std::string &oid,
+                  uint64_t notify_id, const WatcherID &watcher_id,
+                  const bufferlist &bl);
+  void finish_notify(TestRadosClient *rados_client, const std::string &oid,
+                     uint64_t notify_id);
+};
+
+} // namespace librados
+
+#endif // CEPH_TEST_WATCH_NOTIFY_H