[ 
https://issues.apache.org/jira/browse/HTTPASYNC-161?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17097601#comment-17097601
 ] 

Michael Osipov commented on HTTPASYNC-161:
------------------------------------------

[~bentindall], tried on FreeBSD 11.3-RELEASE. Something is really really wrong 
here. After a few hunders attempts procstat shows thousands of open FDs. Every 
other invocation of an application exits with "Cannot allocate memory.". Then 
it completely stalls at "Attempt 2078..." and takes way longer than 10 ms to 
allocate another attempt. By then it has " 868 java             24961 k - 
rw------   2       0 -   -" more than 25 000 open FDs here.

> HttpAsyncClient 5.0 file descriptor leak
> ----------------------------------------
>
>                 Key: HTTPASYNC-161
>                 URL: https://issues.apache.org/jira/browse/HTTPASYNC-161
>             Project: HttpComponents HttpAsyncClient
>          Issue Type: Bug
>            Reporter: Ben Tindall
>            Priority: Major
>         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