From: Yingxin Cheng Date: Fri, 24 Dec 2021 03:05:30 +0000 (+0800) Subject: crimson/test: fix SeastarRunner when app is not started X-Git-Tag: v17.1.0~164^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F44396%2Fhead;p=ceph.git crimson/test: fix SeastarRunner when app is not started Support the case when the SeastarRunner isn't able to start the app, for example, when start with --help. Signed-off-by: Yingxin Cheng --- diff --git a/src/test/crimson/gtest_seastar.cc b/src/test/crimson/gtest_seastar.cc index 175a744c765dd..f7fd05ed3b166 100644 --- a/src/test/crimson/gtest_seastar.cc +++ b/src/test/crimson/gtest_seastar.cc @@ -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([] { diff --git a/src/test/crimson/seastar_runner.h b/src/test/crimson/seastar_runner.h index ab140fa99cab7..a6a4f98729192 100644 --- a/src/test/crimson/seastar_runner.h +++ b/src/test/crimson/seastar_runner.h @@ -14,43 +14,65 @@ #include 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 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 void run(Func &&func) { + assert(is_running()); auto fut = seastar::alien::submit_to(app.alien(), 0, std::forward(func)); fut.get();