[ 
https://issues.apache.org/jira/browse/DIRMINA-786?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Emmanuel Lecharny resolved DIRMINA-786.
---------------------------------------

    Resolution: Invalid

Call the Connector.dispose() method.

> Resource not being cleaned properly in NioSocketConnector and NioProcessor 
> classes
> ----------------------------------------------------------------------------------
>
>                 Key: DIRMINA-786
>                 URL: https://issues.apache.org/jira/browse/DIRMINA-786
>             Project: MINA
>          Issue Type: Bug
>          Components: Core
>    Affects Versions: 2.0.0-RC1
>         Environment: linux
>            Reporter: Chandrika R
>
> I have a situation where I created NioSocketConnector object, connect to http 
> service, send a request, process the response and close. I find that when an 
> instance of NioSocketConnector object is created with default parameters and 
> closed subsequently, the Selector objects created in NioSocketConnector and 
> NioProcessor do not get closed. When this happens repeatedly, then after a 
> while, the exception  java.io.IOException: Too many open files is thrown. I 
> found two issues where there are potential leaks.
> 1. In SimpleIoProcessorPool.java, when an instance of IoProcessor class is 
> being created for pool[0] as below, when the first instance is created 
> successfully, the next instance creation should check if pool[0] is null.
>            try {
>                 try {
>                     processorConstructor = processorType
>                             .getConstructor(ExecutorService.class);
>                     pool[0] = processorConstructor.newInstance(executor);
>                 } catch (NoSuchMethodException e) {
>                     // To the next step...
>                 }
>                 try {
>                         processorConstructor = 
> processorType.getConstructor(Executor.class);
>                         pool[0] = processorConstructor.newInstance(executor);
>                 } catch (NoSuchMethodException e) {
>                         // To the next step...
>                 }
>                 try {
>                         processorConstructor = processorType.getConstructor();
>                         usesExecutorArg = false;
>                         pool[0] = processorConstructor.newInstance();
>                 } catch (NoSuchMethodException e) {
>                         // To the next step...
>                 }
> 2. When SimpleIoProcessorPool object is destroyed, the processor dispose 
> calls are invoked but the executor service is shutdown immediately and hence 
> the AbstractPollingIoProcessor.Processor.run is never invoked to clean up the 
> resources. Same issue is seen in AbstractPollingIoConnector implementation 
> also.
>     public final void dispose() {
>         if (disposed) {
>             return;
>         }
>         synchronized (disposalLock) {
>             if (!disposing) {
>                 disposing = true;
>                 for (int i = pool.length - 1; i >= 0; i--) {
>                     //if (pool[i] == null || pool[i].isDisposing()) {
>                     if (pool[i] == null) {
>                         continue;
>                     }
>                     try {
>                         System.out.println("Disposing " + pool[i]);
>                         pool[i].dispose();
>                     } catch (Exception e) {
>                         LOGGER.warn("Failed to dispose a "
>                                 + pool[i].getClass().getSimpleName()
>                                 + " at index " + i + ".", e);
>                     } finally {
>                         pool[i] = null;
>                     }
>                 }
>                 if (createdExecutor) {
>                     ((ExecutorService) executor).shutdown();
>                 }
>             }
>         }
> I created my own Executor and SimpleIoProcessorPool instances which I pass to 
> NioSocketConnector as an alternate solution for issue 2.
> Thanks
> Chandrika
> Exception log:
>       at sun.nio.ch.FileDispatcher.read0(Native Method)
>       at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:21)
>       at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:233)
>       at sun.nio.ch.IOUtil.read(IOUtil.java:206)
>       at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:236)
>       at 
> org.apache.mina.transport.socket.nio.NioProcessor.read(NioProcessor.java:202)
>       at 
> org.apache.mina.transport.socket.nio.NioProcessor.read(NioProcessor.java:42)
>       at 
> org.apache.mina.core.polling.AbstractPollingIoProcessor.read(AbstractPollingIoProcessor.java:620)
>       at 
> org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:598)
>       at 
> org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:587)
>       at 
> org.apache.mina.core.polling.AbstractPollingIoProcessor.access$400(AbstractPollingIoProcessor.java:61)
>       at 
> org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.run(AbstractPollingIoProcessor.java:969)
>       at 
> org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:64)
>       at 
> java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
>       at 
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
>       at java.lang.Thread.run(Thread.java:619)
> org.apache.mina.core.RuntimeIoException: Failed to create a new instance of 
> org.apache.mina.transport.socket.nio.NioProcessor
>       at 
> org.apache.mina.core.service.SimpleIoProcessorPool.<init>(SimpleIoProcessorPool.java:171)
>       at 
> org.apache.mina.core.service.SimpleIoProcessorPool.<init>(SimpleIoProcessorPool.java:104)
>       at 
> org.apache.mina.core.polling.AbstractPollingIoConnector.<init>(AbstractPollingIoConnector.java:93)
>       at 
> org.apache.mina.transport.socket.nio.NioSocketConnector.<init>(NioSocketConnector.java:55)
>       at org.red5.server.net.muxrtmp.HttpClient.connect(HttpClient.java:76)
>       at 
> org.red5.server.net.muxrtmp.MuxRTMPMinaConnection.connectToHttpService(MuxRTMPMinaConnection.java:102)
>       at 
> org.red5.server.net.muxrtmp.HttpHandler.messageReceived(HttpHandler.java:64)
>       at 
> org.red5.server.net.muxrtmp.MuxRTMPSMinaIoHandler.messageReceived(MuxRTMPSMinaIoHandler.java:89)
>       at 
> org.apache.mina.core.filterchain.DefaultIoFilterChain$TailFilter.messageReceived(DefaultIoFilterChain.java:713)
>       at 
> org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:434)
>       at 
> org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1200(DefaultIoFilterChain.java:46)
>       at 
> org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:793)
>       at 
> org.apache.mina.core.filterchain.IoFilterEvent.fire(IoFilterEvent.java:71)
>       at org.apache.mina.core.session.IoEvent.run(IoEvent.java:63)
>       at 
> org.apache.mina.filter.executor.OrderedThreadPoolExecutor$Worker.runTask(OrderedThreadPoolExecutor.java:780)
>       at 
> org.apache.mina.filter.executor.OrderedThreadPoolExecutor$Worker.runTasks(OrderedThreadPoolExecutor.java:772)
>       at 
> org.apache.mina.filter.executor.OrderedThreadPoolExecutor$Worker.run(OrderedThreadPoolExecutor.java:714)
>       at java.lang.Thread.run(Thread.java:619)
> Caused by: java.lang.reflect.InvocationTargetException
>       at sun.reflect.GeneratedConstructorAccessor37.newInstance(Unknown 
> Source)
>       at 
> sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
>       at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
>       at 
> org.apache.mina.core.service.SimpleIoProcessorPool.<init>(SimpleIoProcessorPool.java:156)
>       ... 17 more
> Caused by: org.apache.mina.core.RuntimeIoException: Failed to open a selector.
>       at 
> org.apache.mina.transport.socket.nio.NioProcessor.<init>(NioProcessor.java:58)
>       ... 21 more
> Caused by: java.io.IOException: Too many open files
>       at sun.nio.ch.IOUtil.initPipe(Native Method)
>       at sun.nio.ch.EPollSelectorImpl.<init>(EPollSelectorImpl.java:49)
>       at 
> sun.nio.ch.EPollSelectorProvider.openSelector(EPollSelectorProvider.java:18)
>       at java.nio.channels.Selector.open(Selector.java:209)
>       at 
> org.apache.mina.transport.socket.nio.NioProcessor.<init>(NioProcessor.java:56)

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to