From 60bceaba7fd544997c8f7c4887bab20de21dc045 Mon Sep 17 00:00:00 2001 From: Radoslaw Zarzynski Date: Sun, 29 Sep 2019 03:49:32 +0200 Subject: [PATCH] crimson: dissect error handling path from ::safe_then(). Signed-off-by: Radoslaw Zarzynski --- src/crimson/common/errorator.h | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/crimson/common/errorator.h b/src/crimson/common/errorator.h index d07c48c7d5a..36de9770078 100644 --- a/src/crimson/common/errorator.h +++ b/src/crimson/common/errorator.h @@ -353,6 +353,18 @@ private: using base_t::base_t; + template + [[gnu::noinline]] + static auto _safe_then_handle_errors(auto&& future, + ErrorVisitor&& errfunc) { + maybe_handle_error_t maybe_handle_error( + std::forward(errfunc), + std::move(future).get_exception() + ); + (maybe_handle_error.template handle() , ...); + return std::move(maybe_handle_error).get_result(); + } + public: using errorator_type = ::crimson::errorator; using promise_type = seastar::promise; @@ -456,12 +468,8 @@ private: errfunc = std::forward(errfunc) ] (auto&& future) mutable [[gnu::always_inline]] noexcept { if (__builtin_expect(future.failed(), false)) { - maybe_handle_error_t maybe_handle_error( - std::forward(errfunc), - std::move(future).get_exception() - ); - (maybe_handle_error.template handle() , ...); - return std::move(maybe_handle_error).get_result(); + return _safe_then_handle_errors( + std::move(future), std::forward(errfunc)); } else { // NOTE: using `seastar::future::get()` here is a bit bloaty // as the method rechecks availability of future's value and, -- 2.39.5