Remove http_io_retry_transient_errors feature flag

What does this MR do and why?

Removes the http_io_retry_transient_errors feature flag and makes the retry behaviour in Gitlab::HttpIO unconditional.

Gitlab::HttpIO reads remote files from object storage (archived CI job traces, remote artifacts opened via GitlabUploader#open) as a series of 128 KB HTTP range requests. A failed chunk request is retried instead of failing the whole read: transport errors (TLS errors, connection resets, DNS failures, EOF, malformed responses) and response codes 429, 500, 502, 503, and 504 are retried, but open/read/write timeouts and other 4xx responses are not. The budget is 3 retries shared across every chunk one HttpIO instance fetches, with a 100 ms base delay that doubles per retry and is jittered.

The flag was a gitlab_com_derisk flag, default disabled, so this behaviour never reached self-managed or GitLab Dedicated while the flag existed. It has been at 100% of actors on GitLab.com since 2026-09-15 and the rollout is complete.

Changes:

  • Delete config/feature_flags/gitlab_com_derisk/http_io_retry_transient_errors.yml
  • Remove the @retry_transient_errors instance variable and its Feature.enabled? check from Gitlab::HttpIO#initialize
  • Remove the #fetch_chunk_response dispatcher and the single-attempt #fetch_chunk_response_once method, and rename #fetch_chunk_response_with_retries to #fetch_chunk_response
  • Move the comment documenting Net::HTTP's own reconnect-and-retry behaviour onto #chunk_attempt, and update the MAX_RETRIES comment that cross-referenced it
  • Remove the specs that stubbed the flag off to assert single-attempt behaviour, since that coverage already exists under the 'retrying transient failures' describe
  • Rework the 'when the server fails persistently and then recovers' example so the whole retry budget has to be spent before the read fails
  • Simplify the sleep stub in the retry describe, which only existed to avoid instantiating the object before the flag stub was in place

References

Screenshots or screen recordings

No user-visible UI change, so no screenshots apply.

How to set up and validate locally

  1. Run bundle exec rspec spec/lib/gitlab/http_io_spec.rb; all examples should pass.
  2. Optionally, read an archived CI job trace or open a remote artifact locally to exercise Gitlab::HttpIO. There is no longer a flag to toggle: the retry behaviour is always on.

MR acceptance checklist

Evaluate this MR against the MR acceptance checklist. It helps you analyze changes to reduce risks in quality, performance, reliability, security, and maintainability.

🤖 Generated with Claude Code

Merge request reports

Loading
Loading