[
https://issues.apache.org/jira/browse/HTTPCORE-631?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17098534#comment-17098534
]
Ben Tindall commented on HTTPCORE-631:
--------------------------------------
[~olegk] in the situation where we create the client then close it immediately
the code performs much better than before, i've tested it with 1000 iterations
and at the end there are almost always 12 KQUEUEs left. I have observed though
that sometimes there are 24 or 36 KQUEUEs left, which means that there is still
a very small possibility of leaking FDs. However, a) the chance is almost
negligible and b) even if it did leak the amount is so small that it wouldn't
cause an issue.
I'm not sure if this is related but what I also observed is that it always
takes 5 seconds to close the client if you close it immediately after creating
it (5 seconds is the awaitShutdown timeout). What seems to happen is that for
some reason in AbstractSingleCoreIOReactor.awaitShutdown the status never
changes from INACTIVE to SHUT_DOWN and therefore it waits for 5 seconds. This
could be a race condition potentially where the shutdown occurs before the
ioReactor is in a state where it could change state?
As I said, a minor thing but just wanted to let you know.
Cheers,
Ben
> HttpAsyncClient 5.0 file descriptor leak
> ----------------------------------------
>
> Key: HTTPCORE-631
> URL: https://issues.apache.org/jira/browse/HTTPCORE-631
> Project: HttpComponents HttpCore
> Issue Type: Bug
> Components: HttpCore NIO
> Affects Versions: 5.0
> Reporter: Ben Tindall
> Priority: Minor
> Fix For: 5.0.1
>
> Attachments: apacheleaktest.tar
>
>
> It seems that HttpAsyncClient doesn't close all its file descriptors with the
> close() operation. Consider the following test:
> {code:java}
> @Test
> public void leakApache() throws Exception {
> for (int i = 0; i < 10000; i++) {
> CloseableHttpAsyncClient client = null;
> try {
> client = HttpAsyncClientBuilder.create().build();
> System.out.println(i);
> } catch (Throwable e) {
> e.printStackTrace();
> } finally {
> if (client != null)
> client.close();
> }
> Thread.sleep(10);
> }
> Thread.sleep(300000);
> }
> {code}
> After around 280 iterations I start seeing this error message
> (java.io.IOException: *Too many open files*):
> {code:java}
> java.lang.IllegalStateException: Unexpected failure opening I/O selector
> at
> org.apache.hc.core5.reactor.AbstractSingleCoreIOReactor.<init>(AbstractSingleCoreIOReactor.java:60)
> at
> org.apache.hc.core5.reactor.SingleCoreIOReactor.<init>(SingleCoreIOReactor.java:81)
> at
> org.apache.hc.core5.reactor.DefaultConnectingIOReactor.<init>(DefaultConnectingIOReactor.java:71)
> at
> org.apache.hc.client5.http.impl.async.HttpAsyncClientBuilder.build(HttpAsyncClientBuilder.java:924)
> at com.mimecast.micro.rest.BenTest.leakApache(BenTest.java:77)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> at java.lang.reflect.Method.invoke(Method.java:498)
> at
> org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
> at
> org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
> at
> org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
> at
> org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
> at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
> at
> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
> at
> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
> at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
> at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
> at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
> at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
> at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
> at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
> at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
> at
> com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
> at
> com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
> at
> com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:230)
> at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:58)
> Caused by: java.io.IOException: Too many open files
> at sun.nio.ch.IOUtil.makePipe(Native Method)
> at sun.nio.ch.KQueueSelectorImpl.<init>(KQueueSelectorImpl.java:84)
> at
> sun.nio.ch.KQueueSelectorProvider.openSelector(KQueueSelectorProvider.java:42)
> at java.nio.channels.Selector.open(Selector.java:227)
> at
> org.apache.hc.core5.reactor.AbstractSingleCoreIOReactor.<init>(AbstractSingleCoreIOReactor.java:58)
> ... 26 more {code}
> If I run lsof i see around 10k files. These files do not get released until
> the whole test closes.
> Is there something I'm missing?
> Thanks,
> Ben
--
This message was sent by Atlassian Jira
(v8.3.4#803005)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]