AssertionError in ResponseSubscribers.HttpResponseInputStream.read() in J11 only
Daniel Fuchs
daniel.fuchs at oracle.com
Tue Oct 4 15:03:24 UTC 2022
Hi Robert,
Could this be a duplicate of JDK-8228970?
I would suggest applying the fix and see if the problem
persists.
best regards,
-- daniel
On 04/10/2022 15:54, Robert Stupp wrote:
> Hi,
>
> Recently I hit a situation where HTTP requests with the “new” Java
> HttpClient ran into TCP-connection-resets, but sadly only on GitHub
> hosted runners and so far I had no luck to reproduce locally. This is
> why I wanted to setup a reproducer for that.
>
> While trying to build that reproducer, I ran into another unrelated, but
> locally reproducible j.l.AssertionError in recent versions of Java 11
> (Java 17 and newer are fine). Reproducing the AE is pretty easy
> (although the reproducer is a bit big): clone
> https://github.com/snazy/http-client-tcp-reset-repro.git
> <https://github.com/snazy/http-client-tcp-reset-repro.git> + `./gradlew
> test` using Java 11. I’ve opened
> https://bugs.openjdk.org/browse/JDK-8294773
> <https://bugs.openjdk.org/browse/JDK-8294773> for this.
>
> The original issue, for which I’m trying to build a reproducer for, is
> strange and hard to narrow down, because it only happens on GH hosted
> runners with the “new” Java HttpClient.
>
> Background (for the TCP-conn-reset): We are using the plain old
> HttpURLConnection approach, and wanted to use the new HttpClient when
> it’s available (with Java 11+).
>
> Requests with small payloads (in request and response) are fine - but
> bigger-ish (couple kb and more) payloads somewhat consistently run into
> TCP-connection-resets, which do not happen with HttpURLConnection and
> the Apache HTTP client. “Somewhat consistently” means: it happens often,
> but not always (kinda flaky).
>
> The reproducer I was trying to build for that uses Jetty 9, Jetty 11 +
> the HTTP server in the JDK on the server side + HttpURLConnection,
> Apache HTTP client and the new Java HttpClient on the client side. The
> matrix of http server/client implementations is that big, because I
> wanted to narrow down whether there’s a specific combination that causes
> the TCP connection reset.
>
> Some things I tried without success:
> * Enable debug logging for the new HttpClient (no luck, debug logging
> changes the timing and the TCP conn reset doesn’t happen)
> * Delay the request processing with a “Thread.sleep(10)” lets the issue
> disappear as well
> * Using Java 17 + 18
> * Using a different OpenJDK distribution (was Azul Zulu, tried Temurin)
> * Using a local Docker container with CPU + memory somewhat similar to
> the GH hosted runner
> * Using very similar IP settings (sysctl stuff for net.code + net.ipv4)
> locally
>
> What I could figure out so far is that the new HttpClient creates a
> connection for mostly every HTTP request, it reuses existing connections
> locally. This happens even if there are HTTP request that were
> completely fine. (<— only on GH hosted runners).
>
> I’ll continue to try to get a reproducer for the TCP-connection-reset issue.
>
> Robert
>
More information about the net-dev
mailing list