]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librados: Test completion creation/handling speed
authorAdam C. Emerson <aemerson@redhat.com>
Tue, 6 Aug 2019 19:24:19 +0000 (15:24 -0400)
committerAdam C. Emerson <aemerson@redhat.com>
Fri, 15 May 2020 14:55:10 +0000 (10:55 -0400)
Signed-off-by: Adam C. Emerson <aemerson@redhat.com>
src/test/librados/CMakeLists.txt
src/test/librados/completion_speed.cc [new file with mode: 0644]

index d4d1c48d5519dc9668a77eb9a11cbc1d23bbd45f..d5a99bd2a32d72ad4837375bdbcf1a8ddba2c714 100644 (file)
@@ -190,3 +190,7 @@ target_link_libraries(unittest_librados_config
   librados
   ${BLKID_LIBRARIES} ${GSSAPI_LIBRARIES} ${OPENLDAP_LIBRARIES})
 
+add_executable(ceph_test_rados_completion_speed
+  completion_speed.cc)
+target_link_libraries(ceph_test_rados_completion_speed
+  librados ${UNITTEST_LIBS} radostest-cxx)
diff --git a/src/test/librados/completion_speed.cc b/src/test/librados/completion_speed.cc
new file mode 100644 (file)
index 0000000..708a584
--- /dev/null
@@ -0,0 +1,38 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+
+#include "include/rados/librados.hpp"
+#include "common/ceph_context.h"
+#include "common/Finisher.h"
+#include "librados/AioCompletionImpl.h"
+
+
+constexpr int max_completions = 10'000'000;
+int completed = 0;
+auto cct = (new CephContext(CEPH_ENTITY_TYPE_CLIENT))->get();
+Finisher f(cct);
+
+void completion_cb(librados::completion_t cb, void* arg) {
+  auto c = static_cast<librados::AioCompletion*>(arg);
+  delete c;
+  if (++completed < max_completions) {
+    auto aio = librados::Rados::aio_create_completion();
+    aio->set_complete_callback(static_cast<void*>(aio), &completion_cb);
+    f.queue(new librados::C_AioComplete(aio->pc));
+  }
+}
+
+int main(void) {
+  auto aio = librados::Rados::aio_create_completion();
+  aio->set_complete_callback(static_cast<void*>(aio), &completion_cb);
+  f.queue(new librados::C_AioComplete(aio->pc));
+  f.start();
+
+  while (completed < max_completions)
+    f.wait_for_empty();
+
+  f.stop();
+
+  assert(completed == max_completions);
+  cct->put();
+}