]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/test: fix SeastarRunner when app is not started 44396/head
authorYingxin Cheng <yingxin.cheng@intel.com>
Fri, 24 Dec 2021 03:05:30 +0000 (11:05 +0800)
committerYingxin Cheng <yingxin.cheng@intel.com>
Sat, 25 Dec 2021 15:18:35 +0000 (23:18 +0800)
Support the case when the SeastarRunner isn't able to start the app,
for example, when start with --help.

Signed-off-by: Yingxin Cheng <yingxin.cheng@intel.com>
src/test/crimson/gtest_seastar.cc
src/test/crimson/seastar_runner.h

index 175a744c765dd5e8f47c758817dfe6206ff2c5cd..f7fd05ed3b166036b019ea77d728c8d6ca243262 100644 (file)
@@ -17,7 +17,11 @@ int main(int argc, char **argv)
 {
   ::testing::InitGoogleTest(&argc, argv);
 
-  seastar_test_suite_t::seastar_env.init(argc, argv);
+  int ret = seastar_test_suite_t::seastar_env.init(argc, argv);
+  if (ret != 0) {
+    seastar_test_suite_t::seastar_env.stop();
+    return ret;
+  }
 
   // HACK: differntiate between the `make check` bot and human user
   // for the sake of log flooding
@@ -38,7 +42,7 @@ int main(int argc, char **argv)
     });
   });
 
-  int ret = RUN_ALL_TESTS();
+  ret = RUN_ALL_TESTS();
 
   seastar_test_suite_t::seastar_env.run([] {
     return crimson::common::sharded_perf_coll().stop().then([] {
index ab140fa99cab7d077aea47b5e441e7f93915962c..a6a4f98729192f65bc5f820d9057c3236370fb91 100644 (file)
 #include <seastar/core/thread.hh>
 
 struct SeastarRunner {
+  static constexpr eventfd_t APP_RUNNING = 1;
+  static constexpr eventfd_t APP_NOT_RUN = 2;
+
   seastar::app_template app;
   seastar::file_desc begin_fd;
   std::unique_ptr<seastar::readable_eventfd> on_end;
 
   std::thread thread;
 
+  bool begin_signaled = false;
+
   SeastarRunner() :
     begin_fd{seastar::file_desc::eventfd(0, 0)} {}
 
   ~SeastarRunner() {}
 
-  void init(int argc, char **argv)
+  bool is_running() const {
+    return !!on_end;
+  }
+
+  int init(int argc, char **argv)
   {
     thread = std::thread([argc, argv, this] { reactor(argc, argv); });
-    eventfd_t result = 0;
+    eventfd_t result;
     if (int r = ::eventfd_read(begin_fd.get(), &result); r < 0) {
       std::cerr << "unable to eventfd_read():" << errno << std::endl;
-      throw std::runtime_error("Cannot start seastar");
+      return r;
+    }
+    assert(begin_signaled == true);
+    if (result == APP_RUNNING) {
+      assert(is_running());
+      return 0;
+    } else {
+      assert(result == APP_NOT_RUN);
+      assert(!is_running());
+      return 1;
     }
   }
   
   void stop()
   {
-    run([this] {
-      on_end->write_side().signal(1);
-      return seastar::now();
-    });
+    if (is_running()) {
+      run([this] {
+        on_end->write_side().signal(1);
+        return seastar::now();
+      });
+    }
     thread.join();
   }
 
   void reactor(int argc, char **argv)
   {
-    app.run(argc, argv, [this] {
+    auto ret = app.run(argc, argv, [this] {
       on_end.reset(new seastar::readable_eventfd);
       return seastar::now().then([this] {
-       ::eventfd_write(begin_fd.get(), 1);
-         return seastar::now();
+       auto r = ::eventfd_write(begin_fd.get(), APP_RUNNING);
+       assert(r == 0);
+       begin_signaled = true;
+       return seastar::now();
       }).then([this] {
        return on_end->wait().then([](size_t){});
       }).handle_exception([](auto ep) {
@@ -59,10 +81,18 @@ struct SeastarRunner {
        on_end.reset();
       });
     });
+    if (ret != 0) {
+      std::cerr << "Seastar app returns " << ret << std::endl;
+    }
+    if (!begin_signaled) {
+      ::eventfd_write(begin_fd.get(), APP_NOT_RUN);
+      begin_signaled = true;
+    }
   }
 
   template <typename Func>
   void run(Func &&func) {
+    assert(is_running());
     auto fut = seastar::alien::submit_to(app.alien(), 0,
                                         std::forward<Func>(func));
     fut.get();