From: Xuehan Xu Date: Tue, 13 Aug 2024 06:59:23 +0000 (+0800) Subject: crimson/common/interruptible_future: new interruptor function `repeat_eagain` X-Git-Tag: v20.0.0~1200^2~2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=1df9dd976774e9379a835089a640ab298d433e98;p=ceph.git crimson/common/interruptible_future: new interruptor function `repeat_eagain` Signed-off-by: Xuehan Xu --- diff --git a/src/crimson/common/interruptible_future.h b/src/crimson/common/interruptible_future.h index 54dbb15e66001..c0bcb5181bcb8 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 9f6b960c9ef92..f3f5098ced148 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)