From: Radoslaw Zarzynski Date: Tue, 22 Nov 2022 16:03:42 +0000 (+0000) Subject: crimson/ertr: let ErrVisitorT return plain value if ValueFuncT returns seastar::future X-Git-Tag: v19.0.0~948^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=bcda14427b5a18f3d7d5284dce72b46f6bf60a8b;p=ceph-ci.git 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 --- diff --git a/src/crimson/common/errorator.h b/src/crimson/common/errorator.h index 33583983c01..705a9f05210 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),