[ 
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

Reply via email to