<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">Oh my - the problem wrt TCP-connection-reset is in front of the computer. Looks like I unintentionally added some “soft dead lock” kinda thingy…<div class=""><br class=""></div><div class="">I was looking for a way to use BodyPublisher backed by a <a href="http://java.io" class="">java.io</a>.OutputStream (because there’s no async variant immediately available from Jackson). So I used a SubmissionPublisher that writes all data (custom OutputStream delegating to SubmissionPublisher.write) - synchronously from inside the subscribe() method - it felt wrong when I initially wrote it, but I later totally forgot about it. So yea - no surprise that things got confused with that. The TCP connection reset was then probably some indirect consequence of that.</div><div class=""><br class=""></div><div class="">Sorry for the false alarm.<div class=""><div><br class=""><blockquote type="cite" class=""><div class="">On 4. Oct 2022, at 18:09, Robert Stupp <<a href="mailto:snazy@snazy.de" class="">snazy@snazy.de</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div class="">Hi Daniel,<br class=""><br class="">Nope, those are unrelated.<br class=""><br class="">And yes, the client’s using HTTP/1.1. I probably hit the AE in the reproducer, because the reproducer’s using `InputStream.readAllBytes()`, which the “original” code cannot (have to stay on Java 8 there - sigh).<br class=""><br class="">I doubt it’s related to keep-alive, because it happens within a millisecond or quicker (the HTTP request processing for that test is rather “stupidly simple”).<br class=""><br class="">Robert<br class=""><br class=""><blockquote type="cite" class="">On 4. Oct 2022, at 17:34, Daniel Fuchs <<a href="mailto:daniel.fuchs@oracle.com" class="">daniel.fuchs@oracle.com</a>> wrote:<br class=""><br class="">Hi Robert,<br class=""><br class="">Are the assertion error and the connection reset linked?<br class="">I mean - if an assertion error occurs then it's anyone guess<br class="">what could happen next - as the behavior at that point<br class="">becomes undefined.<br class=""><br class="">Otherwise connection reset usually means that the connection<br class="">was closed while data remained in the pipe.<br class="">I am assuming the underlying protocol is HTTP/1.1?<br class=""><br class="">The HttpClient has a rather large HTTP/1.1 keep alive timeout [1],<br class="">so it could happen that the server keep alive expires before the<br class="">client, causing the server to close the connection while the client<br class="">is trying to reuse it. If some data has been sent but not delivered<br class="">at that point it might explain the reset.<br class="">If that's the case, tuning the keep-alive timeout on the<br class="">client side to expire before the server's might help.<br class=""><br class="">best regards,<br class=""><br class="">-- daniel<br class="">[1] jdk.httpclient.keepalive.timeout in <a href="https://docs.oracle.com/en/java/javase/17/core/java-networking.html" class="">https://docs.oracle.com/en/java/javase/17/core/java-networking.html</a><br class=""><br class="">On 04/10/2022 16:18, Robert Stupp wrote:<br class=""><blockquote type="cite" class="">The issue that drives me crazy is the TCP connection reset one. Do you have any idea what might cause it? It doesn’t happen with other HTTP clients (Apache or HttpURLConnection). What I see for the TCP connection resets is always something like this (stack trace from Java 11). With the reproducer I’m trying to build I want to get Jackson and other stuff out of the game.<br class="">Caused by: java.io.IOException: closed<br class=""><span class="Apple-tab-span" style="white-space:pre"> </span>at java.net.http/jdk.internal.net.http.ResponseSubscribers$HttpResponseInputStream.current(ResponseSubscribers.java:368)<br class=""><span class="Apple-tab-span" style="white-space:pre"> </span>at java.net.http/jdk.internal.net.http.ResponseSubscribers$HttpResponseInputStream.read(ResponseSubscribers.java:403)<br class=""><span class="Apple-tab-span" style="white-space:pre"> </span>at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._loadMore(UTF8StreamJsonParser.java:220)<br class=""><span class="Apple-tab-span" style="white-space:pre"> </span>at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._loadMoreGuaranteed(UTF8StreamJsonParser.java:2401)<br class=""><span class="Apple-tab-span" style="white-space:pre"> </span>at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._finishString2(UTF8StreamJsonParser.java:2486)<br class=""><span class="Apple-tab-span" style="white-space:pre"> </span>at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._finishAndReturnString(UTF8StreamJsonParser.java:2466)<br class=""><span class="Apple-tab-span" style="white-space:pre"> </span>at com.fasterxml.jackson.core.json.UTF8StreamJsonParser.getText(UTF8StreamJsonParser.java:297)<br class=""><span class="Apple-tab-span" style="white-space:pre"> </span>at com.fasterxml.jackson.core.json.UTF8StreamJsonParser.nextTextValue(UTF8StreamJsonParser.java:1281)<br class=""><span class="Apple-tab-span" style="white-space:pre"> </span>at com.fasterxml.jackson.databind.deser.std.StringCollectionDeserializer.deserialize(StringCollectionDeserializer.java:192)<br class=""><span class="Apple-tab-span" style="white-space:pre"> </span>... 100 more<br class="">Caused by: java.io.IOException: chunked transfer encoding, state: READING_DATA<br class=""><span class="Apple-tab-span" style="white-space:pre"> </span>at java.net.http/jdk.internal.net.http.common.Utils.wrapWithExtraDetail(Utils.java:330)<br class=""><span class="Apple-tab-span" style="white-space:pre"> </span>at java.net.http/jdk.internal.net.http.Http1Response$BodyReader.onReadError(Http1Response.java:758)<br class=""><span class="Apple-tab-span" style="white-space:pre"> </span>at java.net.http/jdk.internal.net.http.Http1AsyncReceiver.checkForErrors(Http1AsyncReceiver.java:297)<br class=""><span class="Apple-tab-span" style="white-space:pre"> </span>at java.net.http/jdk.internal.net.http.Http1AsyncReceiver.flush(Http1AsyncReceiver.java:263)<br class=""><span class="Apple-tab-span" style="white-space:pre"> </span>at java.net.http/jdk.internal.net.http.common.SequentialScheduler$SynchronizedRestartableTask.run(SequentialScheduler.java:175)<br class=""><span class="Apple-tab-span" style="white-space:pre"> </span>at java.net.http/jdk.internal.net.http.common.SequentialScheduler$CompleteRestartableTask.run(SequentialScheduler.java:147)<br class=""><span class="Apple-tab-span" style="white-space:pre"> </span>at java.net.http/jdk.internal.net.http.common.SequentialScheduler$SchedulableTask.run(SequentialScheduler.java:198)<br class=""><span class="Apple-tab-span" style="white-space:pre"> </span>at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)<br class=""><span class="Apple-tab-span" style="white-space:pre"> </span>at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)<br class=""><span class="Apple-tab-span" style="white-space:pre"> </span>at java.base/java.lang.Thread.run(Thread.java:829)<br class="">Caused by: java.io.IOException: Connection reset by peer<br class=""><span class="Apple-tab-span" style="white-space:pre"> </span>at java.base/sun.nio.ch.FileDispatcherImpl.read0(Native Method)<br class=""><span class="Apple-tab-span" style="white-space:pre"> </span>at java.base/sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:39)<br class=""><span class="Apple-tab-span" style="white-space:pre"> </span>at java.base/sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:276)<br class=""><span class="Apple-tab-span" style="white-space:pre"> </span>at java.base/sun.nio.ch.IOUtil.read(IOUtil.java:245)<br class=""><span class="Apple-tab-span" style="white-space:pre"> </span>at java.base/sun.nio.ch.IOUtil.read(IOUtil.java:223)<br class=""><span class="Apple-tab-span" style="white-space:pre"> </span>at java.base/sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:356)<br class=""><span class="Apple-tab-span" style="white-space:pre"> </span>at java.net.http/jdk.internal.net.http.SocketTube.readAvailable(SocketTube.java:1153)<br class=""><span class="Apple-tab-span" style="white-space:pre"> </span>at java.net.http/jdk.internal.net.http.SocketTube$InternalReadPublisher$InternalReadSubscription.read(SocketTube.java:821)<br class=""><span class="Apple-tab-span" style="white-space:pre"> </span>at java.net.http/jdk.internal.net.http.SocketTube$SocketFlowTask.run(SocketTube.java:175)<br class=""><span class="Apple-tab-span" style="white-space:pre"> </span>at java.net.http/jdk.internal.net.http.common.SequentialScheduler$SchedulableTask.run(SequentialScheduler.java:198)<br class=""><span class="Apple-tab-span" style="white-space:pre"> </span>at java.net.http/jdk.internal.net.http.common.SequentialScheduler.runOrSchedule(SequentialScheduler.java:271)<br class=""><span class="Apple-tab-span" style="white-space:pre"> </span>at java.net.http/jdk.internal.net.http.common.SequentialScheduler.runOrSchedule(SequentialScheduler.java:224)<br class=""><span class="Apple-tab-span" style="white-space:pre"> </span>at java.net.http/jdk.internal.net.http.SocketTube$InternalReadPublisher$InternalReadSubscription.signalReadable(SocketTube.java:763)<br class=""><span class="Apple-tab-span" style="white-space:pre"> </span>at java.net.http/jdk.internal.net.http.SocketTube$InternalReadPublisher$ReadEvent.signalEvent(SocketTube.java:941)<br class=""><span class="Apple-tab-span" style="white-space:pre"> </span>at java.net.http/jdk.internal.net.http.SocketTube$SocketFlowEvent.handle(SocketTube.java:245)<br class=""><span class="Apple-tab-span" style="white-space:pre"> </span>at java.net.http/jdk.internal.net.http.HttpClientImpl$SelectorManager.handleEvent(HttpClientImpl.java:957)<br class=""><span class="Apple-tab-span" style="white-space:pre"> </span>at java.net.http/jdk.internal.net.http.HttpClientImpl$SelectorManager.lambda$run$3(HttpClientImpl.java:912)<br class=""><span class="Apple-tab-span" style="white-space:pre"> </span>at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)<br class=""><span class="Apple-tab-span" style="white-space:pre"> </span>at java.net.http/jdk.internal.net.http.HttpClientImpl$SelectorManager.run(HttpClientImpl.java:912)<br class=""></blockquote><br class=""></blockquote><br class=""></div></div></blockquote></div><br class=""></div></div></body></html>