initial code repo
[stor4nfv.git] / src / ceph / src / test / multi_stress_watch.cc
diff --git a/src/ceph/src/test/multi_stress_watch.cc b/src/ceph/src/test/multi_stress_watch.cc
new file mode 100644 (file)
index 0000000..f105c46
--- /dev/null
@@ -0,0 +1,175 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- 
+#include "include/rados/librados.h"
+#include "include/rados/librados.hpp"
+#include "test/librados/test.h"
+
+#include <semaphore.h>
+#include <errno.h>
+#include <map>
+#include <sstream>
+#include <iostream>
+#include <string>
+#include <stdlib.h>
+#include <unistd.h>
+
+using namespace librados;
+using std::map;
+using std::ostringstream;
+using std::string;
+
+static sem_t sem;
+
+class WatchNotifyTestCtx : public WatchCtx
+{
+public:
+    void notify(uint8_t opcode, uint64_t ver, bufferlist& bl) override
+    {
+      sem_post(&sem);
+    }
+};
+
+#pragma GCC diagnostic ignored "-Wpragmas"
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+
+void
+test_loop(Rados &cluster, std::string pool_name, std::string obj_name)
+{
+  int ret;
+  IoCtx ioctx;
+  ret = cluster.ioctx_create(pool_name.c_str(), ioctx);
+  if (ret < 0) {
+    std::cerr << "ioctx_create " << pool_name << " failed with " << ret << std::endl;
+    exit(1);
+  }
+  ioctx.application_enable("rados", true);
+
+  ret = ioctx.create(obj_name, false);
+  if (ret < 0) {
+    std::cerr << "create failed with " << ret << std::endl;
+    exit(1);
+  }
+
+  for (int i = 0; i < 10000; ++i) {
+    std::cerr << "Iteration " << i << std::endl;
+    uint64_t handle;
+    WatchNotifyTestCtx ctx;
+    ret = ioctx.watch(obj_name, 0, &handle, &ctx);
+    assert(!ret);
+    bufferlist bl2;
+    ret = ioctx.notify(obj_name, 0, bl2);
+    assert(!ret);
+    TestAlarm alarm;
+    sem_wait(&sem);
+    ioctx.unwatch(obj_name, handle);
+  }
+
+  ioctx.close();
+  ret = cluster.pool_delete(pool_name.c_str());
+  if (ret < 0) {
+    std::cerr << "pool_delete failed with " << ret << std::endl;
+    exit(1);
+  }
+}
+
+#pragma GCC diagnostic pop
+#pragma GCC diagnostic warning "-Wpragmas"
+
+void
+test_replicated(Rados &cluster, std::string pool_name, std::string obj_name)
+{
+  // May already exist
+  cluster.pool_create(pool_name.c_str());
+
+  test_loop(cluster, pool_name, obj_name);
+}
+
+void
+test_erasure(Rados &cluster, std::string pool_name, std::string obj_name)
+{
+  string outs;
+  bufferlist inbl;
+  int ret;
+  ret = cluster.mon_command(
+    "{\"prefix\": \"osd erasure-code-profile set\", \"name\": \"testprofile\", \"profile\": [ \"k=2\", \"m=1\", \"crush-failure-domain=osd\"]}",
+    inbl, NULL, &outs);
+  if (ret < 0) {
+    std::cerr << "mon_command erasure-code-profile set failed with " << ret << std::endl;
+    exit(1);
+  }
+  //std::cout << outs << std::endl;
+
+  outs.clear();
+  ret = cluster.mon_command(
+    "{\"prefix\": \"osd pool create\", \"pool\": \"" + pool_name + "\", \"pool_type\":\"erasure\", \"pg_num\":12, \"pgp_num\":12, \"erasure_code_profile\":\"testprofile\"}",
+    inbl, NULL, &outs);
+  if (ret < 0) {
+    std::cerr << outs << std::endl;
+    std::cerr << "mon_command create pool failed with " << ret << std::endl;
+    exit(1);
+  }
+  //std::cout << outs << std::endl;
+
+  cluster.wait_for_latest_osdmap();
+  test_loop(cluster, pool_name, obj_name);
+  return;
+}
+
+int main(int args, char **argv)
+{
+  if (args != 3 && args != 4) {
+    std::cerr << "Error: " << argv[0] << " [ec|rep] pool_name obj_name" << std::endl;
+    return 1;
+  }
+
+  std::string pool_name, obj_name, type;
+  // For backward compatibility with unmodified teuthology version
+  if (args == 3) {
+    type = "rep";
+    pool_name = argv[1];
+    obj_name = argv[2];
+  } else {
+    type = argv[1];
+    pool_name = argv[2];
+    obj_name = argv[3];
+  }
+  std::cerr << "Test type " << type << std::endl;
+  std::cerr << "pool_name, obj_name are " << pool_name << ", " << obj_name << std::endl;
+
+  if (type != "ec" && type != "rep") {
+    std::cerr << "Error: " << argv[0] << " Invalid arg must be 'ec' or 'rep' saw " << type << std::endl;
+    return 1;
+  }
+
+  char *id = getenv("CEPH_CLIENT_ID");
+  if (id) std::cerr << "Client id is: " << id << std::endl;
+  Rados cluster;
+  int ret;
+  ret = cluster.init(id);
+  if (ret) {
+    std::cerr << "Error " << ret << " in cluster.init" << std::endl;
+    return ret;
+  }
+  ret = cluster.conf_read_file(NULL);
+  if (ret) {
+    std::cerr << "Error " << ret << " in cluster.conf_read_file" << std::endl;
+    return ret;
+  }
+  ret = cluster.conf_parse_env(NULL);
+  if (ret) {
+    std::cerr << "Error " << ret << " in cluster.conf_read_env" << std::endl;
+    return ret;
+  }
+  ret = cluster.connect();
+  if (ret) {
+    std::cerr << "Error " << ret << " in cluster.connect" << std::endl;
+    return ret;
+  }
+  if (type == "rep")
+    test_replicated(cluster, pool_name, obj_name);
+  else if (type == "ec")
+    test_erasure(cluster, pool_name, obj_name);
+
+  sem_destroy(&sem);
+  return 0;
+}