diff --git a/docs/root/configuration/http/http_filters/router_filter.rst b/docs/root/configuration/http/http_filters/router_filter.rst index 6575e0ed23362..43a60e990c3f2 100644 --- a/docs/root/configuration/http/http_filters/router_filter.rst +++ b/docs/root/configuration/http/http_filters/router_filter.rst @@ -274,14 +274,6 @@ for the next health check interval. The host can become healthy again via standa checks. See the :ref:`health checking overview ` for more information. -.. _config_http_filters_router_x-envoy-overloaded_consumed: - -x-envoy-overloaded -^^^^^^^^^^^^^^^^^^ - -If this header is set by upstream, Envoy will not retry. Currently the value of the header is not -looked at, only its presence. - .. _config_http_filters_router_x-envoy-ratelimited: x-envoy-ratelimited diff --git a/docs/root/intro/arch_overview/http/http_routing.rst b/docs/root/intro/arch_overview/http/http_routing.rst index 95ce2b6ed796f..d71ae677a3489 100644 --- a/docs/root/intro/arch_overview/http/http_routing.rst +++ b/docs/root/intro/arch_overview/http/http_routing.rst @@ -122,8 +122,10 @@ headers `. The following configurat :ref:`retry priority ` can be configured to adjust the priority load used when selecting a priority for retries. -Note that retries may be disabled depending on the contents of the :ref:`x-envoy-overloaded -`. +Note that Envoy retries requests when :ref:`x-envoy-overloaded +` is present. It is recommended to either configure +:ref:`retry budgets (preferred) ` or set +:ref:`maximum active retries circuit breaker ` to an appropriate value to avoid retry storms. .. _arch_overview_http_routing_hedging: diff --git a/docs/root/version_history/current.rst b/docs/root/version_history/current.rst index 662f014a72d2a..4590a3cc752c2 100644 --- a/docs/root/version_history/current.rst +++ b/docs/root/version_history/current.rst @@ -17,6 +17,7 @@ Changes Can be reverted temporarily by setting runtime feature `envoy.reloadable_features.fix_upgrade_response` to false. * network filters: added a :ref:`postgres proxy filter `. * router: allow retries of streaming or incomplete requests. This removes stat `rq_retry_skipped_request_not_complete`. +* router: allow retries by default when upstream responds with :ref:`x-envoy-overloaded `. * tracing: tracing configuration has been made fully dynamic and every HTTP connection manager can now have a separate :ref:`tracing provider `. diff --git a/include/envoy/http/header_map.h b/include/envoy/http/header_map.h index 0c8ddb6adcfd0..512b59c35445e 100644 --- a/include/envoy/http/header_map.h +++ b/include/envoy/http/header_map.h @@ -325,7 +325,6 @@ class HeaderEntry { HEADER_FUNC(Etag) \ HEADER_FUNC(EnvoyDegraded) \ HEADER_FUNC(EnvoyImmediateHealthCheckFail) \ - HEADER_FUNC(EnvoyOverloaded) \ HEADER_FUNC(EnvoyRateLimited) \ HEADER_FUNC(EnvoyUpstreamCanary) \ HEADER_FUNC(EnvoyUpstreamHealthCheckedCluster) \ diff --git a/source/common/router/retry_state_impl.cc b/source/common/router/retry_state_impl.cc index 2952b7a341573..7d29a00332df9 100644 --- a/source/common/router/retry_state_impl.cc +++ b/source/common/router/retry_state_impl.cc @@ -281,10 +281,6 @@ RetryStatus RetryStateImpl::shouldHedgeRetryPerTryTimeout(DoRetryCallback callba } bool RetryStateImpl::wouldRetryFromHeaders(const Http::ResponseHeaderMap& response_headers) { - if (response_headers.EnvoyOverloaded() != nullptr) { - return false; - } - // We never retry if the request is rate limited. if (response_headers.EnvoyRateLimited() != nullptr) { return false; diff --git a/source/common/router/router.cc b/source/common/router/router.cc index de4278259e656..89b8626db4b04 100644 --- a/source/common/router/router.cc +++ b/source/common/router/router.cc @@ -508,7 +508,8 @@ Http::FilterHeadersStatus Filter::decodeHeaders(Http::RequestHeaderMap& headers, Http::Code::ServiceUnavailable, "maintenance mode", [modify_headers, this](Http::ResponseHeaderMap& headers) { if (!config_.suppress_envoy_headers_) { - headers.setReferenceEnvoyOverloaded(Http::Headers::get().EnvoyOverloadedValues.True); + headers.addReference(Http::Headers::get().EnvoyOverloaded, + Http::Headers::get().EnvoyOverloadedValues.True); } // Note: append_cluster_info does not respect suppress_envoy_headers. modify_headers(headers); @@ -999,7 +1000,8 @@ void Filter::onUpstreamAbort(Http::Code code, StreamInfo::ResponseFlag response_ code, body, [dropped, this](Http::ResponseHeaderMap& headers) { if (dropped && !config_.suppress_envoy_headers_) { - headers.setReferenceEnvoyOverloaded(Http::Headers::get().EnvoyOverloadedValues.True); + headers.addReference(Http::Headers::get().EnvoyOverloaded, + Http::Headers::get().EnvoyOverloadedValues.True); } modify_headers_(headers); }, diff --git a/test/common/router/retry_state_impl_test.cc b/test/common/router/retry_state_impl_test.cc index 6b55caf212881..25044563d5a15 100644 --- a/test/common/router/retry_state_impl_test.cc +++ b/test/common/router/retry_state_impl_test.cc @@ -203,7 +203,8 @@ TEST_F(RouterRetryStateImplTest, Policy5xxRemote503Overloaded) { Http::TestResponseHeaderMapImpl response_headers{{":status", "503"}, {"x-envoy-overloaded", "true"}}; - EXPECT_EQ(RetryStatus::No, state_->shouldRetryHeaders(response_headers, callback_)); + expectTimerCreateAndEnable(); + EXPECT_EQ(RetryStatus::Yes, state_->shouldRetryHeaders(response_headers, callback_)); } TEST_F(RouterRetryStateImplTest, PolicyResourceExhaustedRemoteRateLimited) {