robertdoo / red5

Automatically exported from code.google.com/p/red5
0 stars 0 forks source link

RTMPClient leaks file handlers (patch) #128

Closed GoogleCodeExporter closed 9 years ago

GoogleCodeExporter commented 9 years ago
What steps will reproduce the problem?
1. Instantiate RTMPClient, do something like lsof -u red5 | wc -l
2. Try to connect to non-existent address or force connection to close on 
remote end
3. Issue lsof again - the number of open pipes will grow as you repeat step 2

What is the expected output? What do you see instead?
Number of open files should not grow.

What version of the product are you using? On what operating system?
red5-trunk, Gentoo Linux, x86_64

Please provide any additional information below.
Patch provided to ensure that SoketConnector will be disposed

Original issue reported on code.google.com by andrei.u...@gmail.com on 9 Sep 2011 at 10:51

Attachments:

GoogleCodeExporter commented 9 years ago
Oops... wrong patch. Here is valid one

Original comment by andrei.u...@gmail.com on 9 Sep 2011 at 11:55

Attachments:

GoogleCodeExporter commented 9 years ago
Also there seem to be problem when calling RTMPClient.connect() from 
ApplicationAdapter methods:

2011-09-13 15:32:22,972 [NioProcessor-1] WARN  
c.vda.videochat.proxy.LivefeedProxy - Error occured while proxing
java.lang.IllegalStateException: DEAD LOCK: IoFuture.await() was invoked from 
an I/O processor thread.  Please use IoFutureListener or configure a proper 
thread model alternatively.
        at org.apache.mina.core.future.DefaultIoFuture.checkDeadLock(DefaultIoFuture.java:239) ~[mina-core-2.0.4.jar:na]
        at org.apache.mina.core.future.DefaultIoFuture.await0(DefaultIoFuture.java:207) ~[mina-core-2.0.4.jar:na]
        at org.apache.mina.core.future.DefaultIoFuture.awaitUninterruptibly(DefaultIoFuture.java:150) ~[mina-core-2.0.4.jar:na]
        at org.red5.server.net.rtmp.RTMPClient.startConnector(RTMPClient.java:96) ~[red5.jar:na]
        at org.red5.server.net.rtmp.BaseRTMPClientHandler.connect(BaseRTMPClientHandler.java:242) ~[red5.jar:na]
        at StreamingProxy.start(StreamingProxy.java:85)
        at start(Proxy.java:109)
        at Proxy.startLive(Proxy.java:69)
        at ApplicationAdapter.streamBroadcastStart(ApplicationAdapter.java:658)
        at org.red5.server.stream.ClientBroadcastStream.notifyBroadcastStart(ClientBroadcastStream.java:484) [red5.jar:na]
        at org.red5.server.stream.ClientBroadcastStream.sendStartNotifications(ClientBroadcastStream.java:841) [red5.jar:na]
        at org.red5.server.stream.ClientBroadcastStream.startPublishing(ClientBroadcastStream.java:866) [red5.jar:na]
        at org.red5.server.stream.StreamService.publish(StreamService.java:489) [red5.jar:na]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.6.0_26]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) ~[na:1.6.0_26]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) ~[na:1.6.0_26]
        at java.lang.reflect.Method.invoke(Method.java:597) ~[na:1.6.0_26]
        at org.red5.server.service.ServiceInvoker.invoke(ServiceInvoker.java:200) [red5.jar:na]
        at org.red5.server.net.rtmp.RTMPHandler.invokeCall(RTMPHandler.java:183) [red5.jar:na]
        at org.red5.server.net.rtmp.RTMPHandler.onInvoke(RTMPHandler.java:390) [red5.jar:na]
        at org.red5.server.net.rtmp.BaseRTMPHandler.messageReceived(BaseRTMPHandler.java:134) [red5.jar:na]
        at org.red5.server.net.rtmp.RTMPMinaIoHandler.messageReceived(RTMPMinaIoHandler.java:207) [red5.jar:na]
        at org.apache.mina.core.filterchain.DefaultIoFilterChain$TailFilter.messageReceived(DefaultIoFilterChain.java:716) [mina-core-2.0.4.jar:na]
        at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:434) [mina-core-2.0.4.jar:na]
        at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1200(DefaultIoFilterChain.java:46) [mina-core-2.0.4.jar:na]
        at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:796) [mina-core-2.0.4.jar:na]
        at org.apache.mina.filter.codec.ProtocolCodecFilter$ProtocolDecoderOutputImpl.flush(ProtocolCodecFilter.java:427) [mina-core-2.0.4.jar:na]
        at org.apache.mina.filter.codec.ProtocolCodecFilter.messageReceived(ProtocolCodecFilter.java:245) [mina-core-2.0.4.jar:na]
        at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:434) [mina-core-2.0.4.jar:na]
        at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1200(DefaultIoFilterChain.java:46) [mina-core-2.0.4.jar:na]
        at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:796) [mina-core-2.0.4.jar:na]
        at org.red5.server.net.rtmpe.RTMPEIoFilter.messageReceived(RTMPEIoFilter.java:125) [red5.jar:na]
        at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:434) [mina-core-2.0.4.jar:na]
        at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1200(DefaultIoFilterChain.java:46) [mina-core-2.0.4.jar:na]
        at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:796) [mina-core-2.0.4.jar:na]
        at org.apache.mina.core.filterchain.IoFilterAdapter.messageReceived(IoFilterAdapter.java:119) [mina-core-2.0.4.jar:na]
        at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:434) [mina-core-2.0.4.jar:na]
        at org.apache.mina.core.filterchain.DefaultIoFilterChain.fireMessageReceived(DefaultIoFilterChain.java:426) [mina-core-2.0.4.jar:na]
        at org.apache.mina.core.polling.AbstractPollingIoProcessor.read(AbstractPollingIoProcessor.java:715) [mina-core-2.0.4.jar:na]
        at org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:668) [mina-core-2.0.4.jar:na]
        at org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:657) [mina-core-2.0.4.jar:na]
        at org.apache.mina.core.polling.AbstractPollingIoProcessor.access$600(AbstractPollingIoProcessor.java:68) [mina-core-2.0.4.jar:na]
        at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.run(AbstractPollingIoProcessor.java:1141) [mina-core-2.0.4.jar:na]
        at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:64) [mina-core-2.0.4.jar:na]
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) [na:1.6.0_26]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) [na:1.6.0_26]
        at java.lang.Thread.run(Thread.java:680) [na:1.6.0_26]

If I got it correctly, this happens because of AbstractPollingIoProcessor in 
stack trace. The obvious workaround is to call connect in separate thread, but 
why do we need that "future.awaitUninterruptibly(CONNECTOR_WORKER_TIMEOUT);" 
string in RTMPClient.connect() ?

Original comment by andrei.u...@gmail.com on 13 Sep 2011 at 12:57

GoogleCodeExporter commented 9 years ago
Also, maybe in RTMPClient.disconnect() the lines

future.getSession().close(false);
// Now wait for the close to be completed
future.awaitUninterruptibly(CONNECTOR_WORKER_TIMEOUT);

should read

future.getSession().close(false).awaitUninterruptibly(CONNECTOR_WORKER_TIMEOUT);

?

Original comment by andrei.u...@gmail.com on 13 Sep 2011 at 12:58

GoogleCodeExporter commented 9 years ago

Original comment by mondain on 13 Sep 2011 at 4:47

GoogleCodeExporter commented 9 years ago

Original comment by mondain on 25 Apr 2012 at 3:39