From bcda14427b5a18f3d7d5284dce72b46f6bf60a8b Mon Sep 17 00:00:00 2001 From: Radoslaw Zarzynski Date: Tue, 22 Nov 2022 16:03:42 +0000 Subject: [PATCH] crimson/ertr: let ErrVisitorT return plain value if ValueFuncT returns seastar::future The following corner case was unsupported till now: ```cpp return os->omap_get_values( ch, hoid, keys ).safe_then([] (FuturizedStore::omap_values_t&& vals) { return 0; }, FuturizedStore::read_errorator::all_same_way([] (auto&) { return -1; })).get(); ``` Signed-off-by: Radoslaw Zarzynski --- src/crimson/common/errorator.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/crimson/common/errorator.h b/src/crimson/common/errorator.h index 33583983c011..705a9f05210c 100644 --- a/src/crimson/common/errorator.h +++ b/src/crimson/common/errorator.h @@ -335,6 +335,13 @@ public: // to throwing an exception by the handler. std::invoke(std::forward(errfunc), ErrorT::error_t::from_exception_ptr(std::move(ep))); + } else if constexpr (seastar::Future) { + // result is seastar::future but return_t is e.g. int. If so, + // the else clause cannot be used as seastar::future lacks + // errorator_type member. + result = seastar::make_ready_future( + std::invoke(std::forward(errfunc), + ErrorT::error_t::from_exception_ptr(std::move(ep)))); } else { result = FuturatorT::type::errorator_type::template make_ready_future( std::invoke(std::forward(errfunc), -- 2.47.3