diff --git a/service/storage_proxy.cc b/service/storage_proxy.cc index 685e4dbec0..57a4285c8c 100644 --- a/service/storage_proxy.cc +++ b/service/storage_proxy.cc @@ -127,20 +127,26 @@ seastar::metrics::label_instance current_scheduling_group_label() { } -template -static future encode_replica_exception_for_rpc(gms::feature_service& features, future&& f) { - if (!f.failed()) { - return make_ready_future(utils::tuple_insert(f.get(), replica::exception_variant{})); - } - std::exception_ptr eptr = f.get_exception(); +template +static future encode_replica_exception_for_rpc(gms::feature_service& features, std::exception_ptr eptr) { if (features.typed_errors_in_read_rpc) { if (auto ex = replica::try_encode_replica_exception(eptr); ex) { - return make_ready_future(utils::tuple_insert(utils::make_default_rpc_tuple(), std::move(ex))); + ResultTuple encoded_ex = utils::make_default_rpc_tuple(); + std::get(encoded_ex) = std::move(ex); + return make_ready_future(std::move(encoded_ex)); } } return make_exception_future(std::move(eptr)); } +template +static future add_replica_exception_to_query_result(gms::feature_service& features, future&& f) { + if (!f.failed()) { + return make_ready_future(utils::tuple_insert(f.get(), replica::exception_variant{})); + } + return encode_replica_exception_for_rpc(features, f.get_exception()); +} + static bool only_me(const inet_address_vector_replica_set& replicas) { return replicas.size() == 1 && replicas[0] == utils::fb_utilities::get_broadcast_address(); } @@ -684,23 +690,21 @@ private: static_assert(verb == static_cast(-1), "Unsupported verb"); } }; - auto to_future = [&](replica::stale_topology_exception e) { - return make_exception_future(std::move(e)); - }; + const auto fence = fence_opt.value_or(fencing_token{}); if (auto stale = _sp.apply_fence(fence, src_ip)) { - co_return co_await encode_replica_exception_for_rpc(p->features(), to_future(std::move(*stale))); + co_return co_await encode_replica_exception_for_rpc(p->features(), std::make_exception_ptr(std::move(*stale))); } auto f = co_await coroutine::as_future(do_query()); tracing::trace(trace_state_ptr, "{} handling is done, sending a response to /{}", verb, src_ip); if (auto stale = _sp.apply_fence(fence, src_ip)) { - co_return co_await encode_replica_exception_for_rpc(p->features(), to_future(std::move(*stale))); + co_return co_await encode_replica_exception_for_rpc(p->features(), std::make_exception_ptr(std::move(*stale))); } - co_return co_await encode_replica_exception_for_rpc(p->features(), std::move(f)); + co_return co_await add_replica_exception_to_query_result(p->features(), std::move(f)); } using read_data_result_t = rpc::tuple>, cache_temperature, replica::exception_variant>;