# java.net.SocketException: recvfrom failed: ETIMEDOUT (Connection timed out) at okhttp3.internal.http2.Http2Connection$ReaderRunnable.onSettings

- **ID:** `android/backpressure-queue-overflow-in-okhttp`
- **Domain:** android
- **Category:** network_error
- **Verification:** ai_generated
- **Fix Rate:** 82%

## Root Cause

OkHttp's HTTP/2 connection backpressure mechanism triggers a timeout when the server's SETTINGS frame is not acknowledged within the default 2-second window, often due to slow network or server-side connection saturation.

## Version Compatibility

| Version | Status | Introduced | Deprecated |
|---------|--------|------------|------------|
| OkHttp 4.12.0 | active | — | — |
| Android 14 (API 34) | active | — | — |
| Android 13 (API 33) | active | — | — |
| OkHttp 3.12.13 | active | — | — |

## Workarounds

1. **Configure OkHttp to use a custom dispatcher with maxRequestsPerHost=1 and retryOnConnectionFailure(true) to reduce backpressure pressure. Example: new OkHttpClient.Builder().dispatcher(new Dispatcher() {{ setMaxRequestsPerHost(1); }}).retryOnConnectionFailure(true).build()** (75% success)
   ```
   Configure OkHttp to use a custom dispatcher with maxRequestsPerHost=1 and retryOnConnectionFailure(true) to reduce backpressure pressure. Example: new OkHttpClient.Builder().dispatcher(new Dispatcher() {{ setMaxRequestsPerHost(1); }}).retryOnConnectionFailure(true).build()
   ```
2. **Set a custom socket factory that adjusts the SO_TIMEOUT to 5000ms on the underlying socket before the HTTP/2 connection is established. Example: OkHttpClient.Builder().socketFactory(new SocketFactory() { ... });** (85% success)
   ```
   Set a custom socket factory that adjusts the SO_TIMEOUT to 5000ms on the underlying socket before the HTTP/2 connection is established. Example: OkHttpClient.Builder().socketFactory(new SocketFactory() { ... });
   ```
3. **Upgrade OkHttp to version 4.12.0 or later which includes a fix for the backpressure timeout handling in the HTTP/2 reader loop.** (90% success)
   ```
   Upgrade OkHttp to version 4.12.0 or later which includes a fix for the backpressure timeout handling in the HTTP/2 reader loop.
   ```

## Dead Ends

- **Increase OkHttp connectTimeout to 30 seconds** — connectTimeout controls the initial TCP handshake, not the SETTINGS acknowledgment timeout. The backpressure timeout is hardcoded in OkHttp's HTTP/2 implementation at 2 seconds. (90% fail)
- **Disable HTTP/2 entirely by setting protocol to Protocol.HTTP_1_1** — While this avoids the error, it disables multiplexing and header compression, degrading performance for all requests. The underlying server or network issue remains unaddressed. (70% fail)
- **Increase readTimeout to 60 seconds** — readTimeout applies to individual stream reads, not the connection-level SETTINGS exchange. The backpressure timeout is independent and remains at 2 seconds. (95% fail)
