Invalid Unicode at EE::ContainerRegistry::Client for Geo::ContainerRepositorySyncService
### Summary Geo container registry replication fails on GitLab 18.10.x (Ubuntu 22.04). The same setup worked correctly on 18.9.5. The failure is specific to `EE::ContainerRegistry::Client` and manifests as a corrupted HTTP response status code (`:34` instead of `200`) when pulling blobs, despite the response body arriving intact. This is **not** the llhttp-ffi issue documented in #595139 — `http 5.3.1` and `llhttp-ffi 0.5.1` are confirmed loaded at runtime. The kernel is 5.15.x. ### Steps to reproduce 1. Set up a Geo secondary site with container registry replication enabled on GitLab 18.10.x (Omnibus, Ubuntu 22.04, single-node). 2. Trigger container registry replication from the primary to the secondary. 3. Observe `Geo::ContainerRepositorySyncService` failing with an `Invalid Unicode` error. ### Example Project N/A (customer environment — see RFH for details) ### What is the current *bug* behavior? `Geo::ContainerRepositorySyncService` fails with an `Invalid Unicode` error when pulling blobs via `EE::ContainerRegistry::Client`. The `http` gem returns a corrupted status code (`:34` instead of `200`), despite the response body being intact. ### What is the expected *correct* behavior? Container registry blob pulling should succeed with HTTP status `200 OK`, and Geo replication should complete without errors. ### Relevant logs and/or screenshots See the internal RFH for logs and command output (contains customer data): [gitlab-com/request-for-help#4663](https://gitlab.com/gitlab-com/request-for-help/-/work_items/4663) ### Output of checks **Ruled out:** - **#595139 (llhttp-ffi 0.4.0 on kernel 6.17):** ruled out — both primary and secondary are running `http 5.3.1` / `llhttp-ffi 0.5.1` as confirmed by `Gem.loaded_specs` in the Rails console, and the kernel is 5.15.x. - **`geo_blob_download_with_gitlab_http` feature flag:** enabled on the primary, confirmed visible on the secondary — no effect, as this flag covers `BlobDownloadService` not `EE::ContainerRegistry::Client`. - **Registry data integrity:** tag listing and manifest fetching succeed; only blob pulling fails. Manual pulls via `Net::HTTP` and `curl` return `200 OK` successfully. #### Results of GitLab environment info <details> <summary>Expand for output related to GitLab environment info</summary> <pre> - GitLab version: 18.10.x - OS: Ubuntu 22.04 - Deployment type: Omnibus - Single-node Geo setup - http gem: 5.3.1 - llhttp-ffi: 0.5.1 - Kernel: 5.15.x </pre> </details> ### Possible fixes !230361 switched `BlobDownloadService` to use `Gitlab::HTTP` (HTTParty/Net::HTTP) instead of the `http` gem to avoid the llhttp-ffi/FFI corruption issue. A similar approach may be needed for `EE::ContainerRegistry::Client#pull_blob`, which still uses the `http` gem and is not covered by the `geo_blob_download_with_gitlab_http` feature flag introduced in that MR. ### Workaround Disable container registry replication on the secondary: ```ruby # gitlab.rb #gitlab_rails['geo_registry_replication_enabled'] = true #gitlab_rails['geo_registry_replication_primary_api_url'] = 'https://registry.example.com/' ``` ### Patch release information for backports If the bug fix needs to be backported in a [patch release](https://handbook.gitlab.com/handbook/engineering/releases/patch-releases) to a version under [the maintenance policy](https://docs.gitlab.com/policy/maintenance/), please follow the steps on the [patch release runbook for GitLab engineers](https://gitlab.com/gitlab-org/release/docs/-/blob/master/general/patch/engineers.md). Refer to the [internal "Release Information" dashboard](https://dashboards.gitlab.net/d/delivery-release_info/delivery3a-release-information?orgId=1) for information about the next patch release, including the targeted versions, expected release date, and current status. #### High-severity bug remediation To remediate high-severity issues requiring an [internal release](https://handbook.gitlab.com/handbook/engineering/releases/internal-releases/) for single-tenant SaaS instances, refer to the [internal release process for engineers](https://gitlab.com/gitlab-org/release/docs/-/blob/master/general/internal-releases/engineers.md?ref_type=heads).
issue