]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
test/neorados: test cross-executor completions
authorCasey Bodley <cbodley@redhat.com>
Thu, 4 Jun 2026 18:19:38 +0000 (14:19 -0400)
committerCasey Bodley <cbodley@redhat.com>
Thu, 25 Jun 2026 16:54:32 +0000 (12:54 -0400)
repurpose ceph_test_neorados_completions to verify that completions are
delivered to the handler's associated executor

Signed-off-by: Casey Bodley <cbodley@redhat.com>
(cherry picked from commit c4d9a406c8e9ed514067a37574dec88a794acd7c)

Conflicts:
qa/workunits/rados/test.sh  missing watch-notify changes
src/test/neorados/CMakeLists.txt  missing watch-notify changes

qa/workunits/rados/test.sh
src/test/neorados/CMakeLists.txt
src/test/neorados/completions.cc

index bceef34b5f54b517c02240a37a643b4c64c201b0..606f24f25e159295ffafe6b2b2059bceab08e484 100755 (executable)
@@ -52,7 +52,7 @@ do
 done
 
 for f in \
-    cls cmd handler_error io ec_io list ec_list misc pool read_operations snapshots \
+    cls cmd completions handler_error io ec_io list ec_list misc pool read_operations snapshots \
     watch_notify write_operations
 do
     if [ $parallel -eq 1 ]; then
index 432b0336425f9037cc1c76198df73d75c67c4409..e10672e3a572323e2f7bf4a6c819e1c69a7289da 100644 (file)
@@ -10,10 +10,6 @@ add_executable(ceph_test_neorados_start_stop start_stop.cc)
 target_link_libraries(ceph_test_neorados_start_stop global libneorados
   ${unittest_libs})
 
-add_executable(ceph_test_neorados_completions completions.cc)
-target_link_libraries(ceph_test_neorados_completions Boost::system pthread
-  ${unittest_libs})
-
 add_executable(ceph_test_neorados_op_speed op_speed.cc)
 target_link_libraries(ceph_test_neorados_op_speed
   libneorados ${FMT_LIB} ${unittest_libs})
@@ -22,6 +18,10 @@ add_library(neoradostest-support STATIC common_tests.cc)
 target_link_libraries(neoradostest-support
   libneorados ${FMT_LIB} GTest::GTest)
 
+add_executable(ceph_test_neorados_completions completions.cc)
+target_link_libraries(ceph_test_neorados_completions
+  libneorados neoradostest-support GTest::Main)
+
 add_executable(ceph_test_neorados_list_pool list_pool.cc)
 target_link_libraries(ceph_test_neorados_list_pool
   libneorados neoradostest-support global ${FMT_LIB} ${unittest_libs})
index a4684e4dc51c534ffa89556faba32bbe5744f6d4..ecfb3cb117bc4b7ad1ab1bfc40c24e38d9f4df66 100644 (file)
@@ -1,19 +1,62 @@
-#include <boost/asio/io_context.hpp>
-#include <boost/asio/post.hpp>
+#include <optional>
+#include <boost/asio/bind_executor.hpp>
+#include "include/neorados/RADOS.hpp"
+#include "test/neorados/common_tests.h"
 
-constexpr int max_completions = 10'000'000;
-int completed = 0;
+TEST(NeoRadosCompletion, CrossExecutor)
+{
+  boost::asio::io_context rados_context;
+  std::optional<neorados::RADOS> rados;
+  std::optional<neorados::IOContext> pool;
 
-boost::asio::io_context c;
+  neorados::RADOS::Builder{}.build(rados_context,
+      [&rados, &pool] (boost::system::error_code ec, neorados::RADOS r) {
+        if (ec) {
+          throw boost::system::system_error(ec);
+        }
+        rados = std::move(r);
 
-void nested_cb() {
-  if (++completed < max_completions)
-    boost::asio::post(c, &nested_cb);
-}
+        const char* pool_name = "ceph_test_neorados_completions";
+        rados->lookup_pool(pool_name,
+            [&rados, &pool, pool_name] (boost::system::error_code ec, int64_t id) {
+              if (ec == boost::system::errc::no_such_file_or_directory) {
+                create_pool(*rados, pool_name,
+                    [&pool] (boost::system::error_code ec, int64_t id) {
+                      if (ec) {
+                        throw boost::system::system_error(ec);
+                      }
+                      pool.emplace(id);
+                    });
+              } else if (ec) {
+                throw boost::system::system_error(ec);
+              } else {
+                pool.emplace(id);
+              }
+            });
+      });
+  rados_context.run();
+
+  // expect ReadOp completion on a separate execution context
+  boost::asio::io_context completion_context;
+  std::optional<boost::system::error_code> ec;
+  uint64_t size;
+  ceph::real_time mtime;
+
+  rados->execute("nonexistent", *pool, neorados::ReadOp{}.stat(&size, &mtime), nullptr,
+      boost::asio::bind_executor(completion_context,
+          [&ec] (boost::system::error_code e) { ec = e; }));
+
+  rados_context.restart();
+  rados_context.run();
+
+  EXPECT_FALSE(ec); // completion does not run on rados_context
+
+  completion_context.run();
+
+  EXPECT_TRUE(ec);
+
+  rados->delete_pool(pool->get_pool(), boost::asio::detached);
 
-int main(void) {
-  boost::asio::post(c, &nested_cb);
-  c.run();
-  assert(completed == max_completions);
-  return 0;
+  rados_context.restart();
+  rados_context.run();
 }