RFR: 8257736: InputStream from BodyPublishers.ofInputStream() leaks when IOE happens [v5]
Yasumasa Suenaga
ysuenaga at openjdk.java.net
Thu Jan 14 02:28:03 UTC 2021
On Wed, 13 Jan 2021 18:59:30 GMT, Daniel Fuchs <dfuchs at openjdk.org> wrote:
>> PING: could you review this PR?
>
> Hi Yasumasa,
>
> The new StreamCloseTest seems to be suffering from some race conditions; On windows I saw it failing 29 times out of 50.
>
> config StreamCloseTest.setup(): success
> test StreamCloseTest.closeTestOnException(): success
> test StreamCloseTest.normallyCloseTest(): failure
> java.io.IOException: HTTP/1.1 header parser received no bytes
> at java.net.http/jdk.internal.net.http.HttpClientImpl.send(HttpClientImpl.java:584)
> at java.net.http/jdk.internal.net.http.HttpClientFacade.send(HttpClientFacade.java:119)
> at StreamCloseTest.normallyCloseTest(StreamCloseTest.java:134)
> at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78)
> at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> at java.base/java.lang.reflect.Method.invoke(Method.java:566)
> at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:85)
> at org.testng.internal.Invoker.invokeMethod(Invoker.java:639)
> at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:821)
> at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1131)
> at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:124)
> at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:108)
> at org.testng.TestRunner.privateRun(TestRunner.java:773)
> at org.testng.TestRunner.run(TestRunner.java:623)
> at org.testng.SuiteRunner.runTest(SuiteRunner.java:357)
> at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:352)
> at org.testng.SuiteRunner.privateRun(SuiteRunner.java:310)
> at org.testng.SuiteRunner.run(SuiteRunner.java:259)
> at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
> at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
> at org.testng.TestNG.runSuitesSequentially(TestNG.java:1185)
> at org.testng.TestNG.runSuitesLocally(TestNG.java:1110)
> at org.testng.TestNG.run(TestNG.java:1018)
> at com.sun.javatest.regtest.agent.TestNGRunner.main(TestNGRunner.java:94)
> at com.sun.javatest.regtest.agent.TestNGRunner.main(TestNGRunner.java:54)
> at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78)
> at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> at java.base/java.lang.reflect.Method.invoke(Method.java:566)
> at com.sun.javatest.regtest.agent.MainWrapper$MainThread.run(MainWrapper.java:127)
> at java.base/java.lang.Thread.run(Thread.java:831)
> Caused by: java.io.IOException: HTTP/1.1 header parser received no bytes
> at java.net.http/jdk.internal.net.http.common.Utils.wrapWithExtraDetail(Utils.java:345)
> at java.net.http/jdk.internal.net.http.Http1Response$HeadersReader.onReadError(Http1Response.java:675)
> at java.net.http/jdk.internal.net.http.Http1AsyncReceiver.checkForErrors(Http1AsyncReceiver.java:302)
> at java.net.http/jdk.internal.net.http.Http1AsyncReceiver.flush(Http1AsyncReceiver.java:268)
> at java.net.http/jdk.internal.net.http.common.SequentialScheduler$SynchronizedRestartableTask.run(SequentialScheduler.java:175)
> at java.net.http/jdk.internal.net.http.common.SequentialScheduler$CompleteRestartableTask.run(SequentialScheduler.java:147)
> at java.net.http/jdk.internal.net.http.common.SequentialScheduler$SchedulableTask.run(SequentialScheduler.java:198)
> at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1135)
> at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
> ... 1 more
> Caused by: java.io.IOException: An established connection was aborted by the software in your host machine
> at java.base/sun.nio.ch.SocketDispatcher.read0(Native Method)
> at java.base/sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:46)
> at java.base/sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:276)
> at java.base/sun.nio.ch.IOUtil.read(IOUtil.java:245)
> at java.base/sun.nio.ch.IOUtil.read(IOUtil.java:223)
> at java.base/sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:417)
> at java.net.http/jdk.internal.net.http.SocketTube.readAvailable(SocketTube.java:1162)
> at java.net.http/jdk.internal.net.http.SocketTube$InternalReadPublisher$InternalReadSubscription.read(SocketTube.java:825)
> at java.net.http/jdk.internal.net.http.SocketTube$SocketFlowTask.run(SocketTube.java:175)
> at java.net.http/jdk.internal.net.http.common.SequentialScheduler$SchedulableTask.run(SequentialScheduler.java:198)
> at java.net.http/jdk.internal.net.http.common.SequentialScheduler.runOrSchedule(SequentialScheduler.java:271)
> at java.net.http/jdk.internal.net.http.common.SequentialScheduler.runOrSchedule(SequentialScheduler.java:224)
> at java.net.http/jdk.internal.net.http.SocketTube$InternalReadPublisher$InternalReadSubscription.signalReadable(SocketTube.java:766)
> at java.net.http/jdk.internal.net.http.SocketTube$InternalReadPublisher$ReadEvent.signalEvent(SocketTube.java:949)
> at java.net.http/jdk.internal.net.http.SocketTube$SocketFlowEvent.handle(SocketTube.java:245)
> at java.net.http/jdk.internal.net.http.HttpClientImpl$SelectorManager.handleEvent(HttpClientImpl.java:976)
> at java.net.http/jdk.internal.net.http.HttpClientImpl$SelectorManager.lambda$run$3(HttpClientImpl.java:931)
> at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
> at java.net.http/jdk.internal.net.http.HttpClientImpl$SelectorManager.run(HttpClientImpl.java:931)
> config StreamCloseTest.teardown(): success
>
> Maybe you should consider using the servers provided by the HttpServerAdapters interface provided in the test directory, as do many other httpclient tests. Look for tests that implement HttpServerAdapters for an example.
Thanks @dfuch to notice the error!
I changed to use `HttpServerAdapters` in StreamCloseTest.java. It works fine on my Linux x64.
Could you review again?
-------------
PR: https://git.openjdk.java.net/jdk/pull/1614
More information about the net-dev
mailing list