[ 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: dev-unsubscr...@hc.apache.org For additional commands, e-mail: dev-h...@hc.apache.org