From 1df9dd976774e9379a835089a640ab298d433e98 Mon Sep 17 00:00:00 2001 From: Xuehan Xu Date: Tue, 13 Aug 2024 14:59:23 +0800 Subject: [PATCH] crimson/common/interruptible_future: new interruptor function `repeat_eagain` Signed-off-by: Xuehan Xu --- src/crimson/common/interruptible_future.h | 21 +++++++++++++++++ src/test/crimson/test_interruptible_future.cc | 23 +++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/src/crimson/common/interruptible_future.h b/src/crimson/common/interruptible_future.h index 54dbb15e660..c0bcb5181bc 100644 --- a/src/crimson/common/interruptible_future.h +++ b/src/crimson/common/interruptible_future.h @@ -1330,6 +1330,27 @@ public: ); } } + + template + [[gnu::always_inline]] + static auto repeat_eagain(AsyncAction&& action) { + return seastar::do_with( + std::forward(action), + [] (auto &f) { + return repeat([&f] { + return std::invoke(f + ).si_then([] { + return seastar::stop_iteration::yes; + }).handle_error_interruptible( + [](const crimson::ct_error::eagain &e) { + return seastar::stop_iteration::no; + }, + crimson::ct_error::pass_further_all{} + ); + }); + }); + } + template requires (!InvokeReturnsInterruptibleFuture) [[gnu::always_inline]] diff --git a/src/test/crimson/test_interruptible_future.cc b/src/test/crimson/test_interruptible_future.cc index 9f6b960c9ef..f3f5098ced1 100644 --- a/src/test/crimson/test_interruptible_future.cc +++ b/src/test/crimson/test_interruptible_future.cc @@ -282,6 +282,29 @@ TEST_F(seastar_test_suite_t, DISABLED_nested_interruptors) }); } +TEST_F(seastar_test_suite_t, interruptible_repeat_eagain) +{ + using interruptor = + interruptible::interruptor; + run_async([] { + interruptor::with_interruption([] { + return seastar::do_with( + 0, + [](auto &i) { + return interruptor::repeat_eagain([&i]() -> base_iertr::future<> { + if (++i < 5) { + return crimson::ct_error::eagain::make(); + } + return base_iertr::now(); + }).si_then([&i] { + std::cout << i << std::endl; + ceph_assert(i == 5); + }); + }); + }, [](std::exception_ptr) {}, false).unsafe_get(); + }); +} + #if 0 // This seems to cause a hang in the gcc-9 linker on bionic TEST_F(seastar_test_suite_t, handle_error) -- 2.39.5