This commit is contained in:
Mateusz Gruszczyński committed 2026-10-14 14:54:22 +02:00
1 parent 1b9135117c
commit 4f36de240c
32 files changed
+1175 -704

No files matched your search

+32 -1
View File
@@ -141,6 +141,7 @@ let mut active_uri = upstream_target;
let mut request_attempt = Some(request);
let mut attempted_backends = Vec::<String>::new();
let mut retries = 0u8;
let mut graceful_retry_done = false;
let upstream_result = loop {
let client = if handshake.is_some() && !websocket_upstream_h2 {
&active_backend.websocket_client
@@ -153,6 +154,36 @@ let upstream_result = loop {
)
.await;
let attempt_elapsed = attempt_started.elapsed();
if let Ok(Err(cause)) = &result {
if !graceful_retry_done
&& !admin_control_plane
&& handshake.is_none()
&& request_body_empty
&& retry_safe_method(&retry_method)
&& (is_graceful_h2_goaway(cause)
|| is_related_h2_close(cause, &active_backend))
{
if let Some(next_request) = retry_request(
&retry_method,
upstream_request_version(&active_backend, false),
&retry_headers,
&active_backend,
&original_host,
&origin_suffix,
retry_host_follows_backend,
) {
graceful_retry_done = true;
if let Some(lease) = &active_lease {
lease.retry_attempted();
}
tracing::debug!(backend = %active_backend.id,
"retrying safe empty request after graceful upstream H2 shutdown");
request_attempt = Some(next_request);
attempt_started = Instant::now();
continue;
}
}
}
let Some(policy) = retry_policy.as_ref() else {
break result;
};
@@ -220,7 +251,7 @@ let upstream_result = loop {
connect_failure,
);
lease.error_detail(
upstream_error_class(cause, connect_failure),
upstream_health_error_class(cause, connect_failure, &active_backend),
&detail,
attempt_elapsed,
);