]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/common/interruptible_future: new interruptor function `repeat_eagain`
authorXuehan Xu <xuxuehan@qianxin.com>
Tue, 13 Aug 2024 06:59:23 +0000 (14:59 +0800)
committerXuehan Xu <xuxuehan@qianxin.com>
Tue, 27 Aug 2024 02:12:50 +0000 (10:12 +0800)
Signed-off-by: Xuehan Xu <xuxuehan@qianxin.com>
src/crimson/common/interruptible_future.h
src/test/crimson/test_interruptible_future.cc

index 54dbb15e66001bf84e05d1e50d476fc1c7440e23..c0bcb5181bcb869bbccb689a67ac861d1a937ec1 100644 (file)
@@ -1330,6 +1330,27 @@ public:
       );
     }
   }
+
+  template <InvokeReturnsInterruptibleFuture AsyncAction>
+  [[gnu::always_inline]]
+  static auto repeat_eagain(AsyncAction&& action) {
+    return seastar::do_with(
+      std::forward<AsyncAction>(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 <typename AsyncAction>
   requires (!InvokeReturnsInterruptibleFuture<AsyncAction>)
   [[gnu::always_inline]]
index 9f6b960c9ef92560a2eea98976669977434ecc97..f3f5098ced1482d19d3007c9f9cefbcb68f03c0b 100644 (file)
@@ -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<TestInterruptCondition>;
+  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)