You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by tr...@apache.org on 2005/04/21 12:49:11 UTC
svn commit: r164032 - in /directory/network/trunk/src:
java/org/apache/mina/io/datagram/ java/org/apache/mina/io/socket/
test/org/apache/mina/examples/echoserver/
Author: trustin
Date: Thu Apr 21 03:49:06 2005
New Revision: 164032
URL: http://svn.apache.org/viewcvs?rev=164032&view=rev
Log:
* Fixed: Resource leakage in DatagramConnector
* Added some tests related with SessionInitializer
Modified:
directory/network/trunk/src/java/org/apache/mina/io/datagram/DatagramConnector.java
directory/network/trunk/src/java/org/apache/mina/io/datagram/DatagramFilterChain.java
directory/network/trunk/src/java/org/apache/mina/io/datagram/DatagramSession.java
directory/network/trunk/src/java/org/apache/mina/io/socket/SocketConnector.java
directory/network/trunk/src/java/org/apache/mina/io/socket/SocketIoProcessor.java
directory/network/trunk/src/java/org/apache/mina/io/socket/SocketSession.java
directory/network/trunk/src/test/org/apache/mina/examples/echoserver/AbstractTest.java
directory/network/trunk/src/test/org/apache/mina/examples/echoserver/AcceptorTest.java
directory/network/trunk/src/test/org/apache/mina/examples/echoserver/ConnectorTest.java
Modified: directory/network/trunk/src/java/org/apache/mina/io/datagram/DatagramConnector.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/io/datagram/DatagramConnector.java?rev=164032&r1=164031&r2=164032&view=diff
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/io/datagram/DatagramConnector.java (original)
+++ directory/network/trunk/src/java/org/apache/mina/io/datagram/DatagramConnector.java Thu Apr 21 03:49:06 2005
@@ -139,6 +139,7 @@
{
if( !initialized )
{
+ ch.socket().close();
ch.close();
}
}
@@ -464,6 +465,7 @@
{
try
{
+ req.channel.socket().close();
req.channel.close();
}
catch (IOException e)
@@ -492,9 +494,11 @@
break;
else
{
+ DatagramChannel ch = ( DatagramChannel ) key.channel();
try
{
- key.channel().close();
+ ch.socket().close();
+ ch.close();
}
catch( IOException e )
{
Modified: directory/network/trunk/src/java/org/apache/mina/io/datagram/DatagramFilterChain.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/io/datagram/DatagramFilterChain.java?rev=164032&r1=164031&r2=164032&view=diff
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/io/datagram/DatagramFilterChain.java (original)
+++ directory/network/trunk/src/java/org/apache/mina/io/datagram/DatagramFilterChain.java Thu Apr 21 03:49:06 2005
@@ -13,7 +13,7 @@
*/
class DatagramFilterChain extends AbstractIoHandlerFilterChain {
- private final DatagramProcessor processor;
+ final DatagramProcessor processor;
DatagramFilterChain( DatagramProcessor processor )
{
Modified: directory/network/trunk/src/java/org/apache/mina/io/datagram/DatagramSession.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/io/datagram/DatagramSession.java?rev=164032&r1=164031&r2=164032&view=diff
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/io/datagram/DatagramSession.java (original)
+++ directory/network/trunk/src/java/org/apache/mina/io/datagram/DatagramSession.java Thu Apr 21 03:49:06 2005
@@ -99,6 +99,10 @@
public void close()
{
+ if( filters.processor instanceof DatagramConnector )
+ {
+ filters.processor.closeSession( this );
+ }
}
Queue getWriteBufferQueue()
Modified: directory/network/trunk/src/java/org/apache/mina/io/socket/SocketConnector.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/io/socket/SocketConnector.java?rev=164032&r1=164031&r2=164032&view=diff
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/io/socket/SocketConnector.java (original)
+++ directory/network/trunk/src/java/org/apache/mina/io/socket/SocketConnector.java Thu Apr 21 03:49:06 2005
@@ -129,11 +129,14 @@
{
ch.socket().bind( localAddress );
}
- ch.configureBlocking( false );
+ ch.configureBlocking( false );
+
if( ch.connect( address ) )
{
- return newSession( ch, handler, initializer );
+ SocketSession session = newSession( ch, handler, initializer );
+ success = true;
+ return session;
}
success = true;
@@ -142,10 +145,11 @@
{
if( !success )
{
+ ch.socket().close();
ch.close();
}
}
-
+
ConnectionRequest request = new ConnectionRequest( ch, timeout, handler, initializer );
synchronized( this )
{
@@ -173,7 +177,7 @@
if( request.exception != null )
{
- request.exception.fillInStackTrace();
+ //request.exception.fillInStackTrace();
throw request.exception;
}
@@ -248,13 +252,25 @@
}
finally
{
+ key.cancel();
+ if( entry.session == null )
+ {
+ try
+ {
+ ch.socket().close();
+ ch.close();
+ }
+ catch( IOException e )
+ {
+ exceptionMonitor.exceptionCaught( this, e );
+ }
+ }
+
synchronized( entry )
{
entry.done = true;
entry.notify();
}
-
- key.cancel();
}
}
Modified: directory/network/trunk/src/java/org/apache/mina/io/socket/SocketIoProcessor.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/io/socket/SocketIoProcessor.java?rev=164032&r1=164031&r2=164032&view=diff
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/io/socket/SocketIoProcessor.java (original)
+++ directory/network/trunk/src/java/org/apache/mina/io/socket/SocketIoProcessor.java Thu Apr 21 03:49:06 2005
@@ -193,6 +193,7 @@
try
{
+ ch.socket().close();
ch.close();
}
catch( IOException e )
Modified: directory/network/trunk/src/java/org/apache/mina/io/socket/SocketSession.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/io/socket/SocketSession.java?rev=164032&r1=164031&r2=164032&view=diff
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/io/socket/SocketSession.java (original)
+++ directory/network/trunk/src/java/org/apache/mina/io/socket/SocketSession.java Thu Apr 21 03:49:06 2005
@@ -71,7 +71,7 @@
this.remoteAddress = ch.socket().getRemoteSocketAddress();
this.localAddress = ch.socket().getLocalSocketAddress();
}
-
+
SocketFilterChain getFilters()
{
return filters;
Modified: directory/network/trunk/src/test/org/apache/mina/examples/echoserver/AbstractTest.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/test/org/apache/mina/examples/echoserver/AbstractTest.java?rev=164032&r1=164031&r2=164032&view=diff
==============================================================================
--- directory/network/trunk/src/test/org/apache/mina/examples/echoserver/AbstractTest.java (original)
+++ directory/network/trunk/src/test/org/apache/mina/examples/echoserver/AbstractTest.java Thu Apr 21 03:49:06 2005
@@ -21,9 +21,12 @@
import java.io.IOException;
import java.net.InetSocketAddress;
+import junit.framework.Assert;
import junit.framework.TestCase;
import org.apache.mina.common.ByteBuffer;
+import org.apache.mina.common.Session;
+import org.apache.mina.common.SessionInitializer;
import org.apache.mina.io.IoAcceptor;
import org.apache.mina.io.datagram.DatagramAcceptor;
import org.apache.mina.io.filter.IoThreadPoolFilter;
@@ -37,6 +40,10 @@
*/
public class AbstractTest extends TestCase
{
+ private final boolean testInitializer;
+
+ private MarkingInitializer initializer;
+
protected int port;
protected IoAcceptor acceptor;
@@ -44,6 +51,11 @@
protected IoAcceptor datagramAcceptor;
protected IoThreadPoolFilter threadPoolFilter;
+
+ protected AbstractTest( boolean testInitializer )
+ {
+ this.testInitializer = testInitializer;
+ }
protected static void assertEquals( byte[] expected, byte[] actual )
{
@@ -75,6 +87,11 @@
{
acceptor = new SocketAcceptor();
datagramAcceptor = new DatagramAcceptor();
+
+ if( testInitializer )
+ {
+ initializer = new MarkingInitializer();
+ }
// Find an availble test port and bind to it.
boolean socketBound = false;
@@ -90,11 +107,12 @@
try
{
acceptor.bind( new InetSocketAddress( port ),
- new EchoProtocolHandler() );
+ new EchoProtocolHandler(), initializer );
socketBound = true;
datagramAcceptor.bind( new InetSocketAddress( port ),
- new EchoProtocolHandler() );
+ new EchoProtocolHandler(),
+ initializer );
datagramBound = true;
break;
@@ -139,5 +157,20 @@
acceptor.unbind( new InetSocketAddress( port ) );
datagramAcceptor.unbind( new InetSocketAddress( port ) );
threadPoolFilter.stop();
+
+ if( initializer != null )
+ {
+ Assert.assertTrue( initializer.executed );
+ }
+ }
+
+ private static class MarkingInitializer implements SessionInitializer
+ {
+ private boolean executed;
+
+ public void initializeSession(Session session) throws IOException
+ {
+ executed = true;
+ }
}
}
Modified: directory/network/trunk/src/test/org/apache/mina/examples/echoserver/AcceptorTest.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/test/org/apache/mina/examples/echoserver/AcceptorTest.java?rev=164032&r1=164031&r2=164032&view=diff
==============================================================================
--- directory/network/trunk/src/test/org/apache/mina/examples/echoserver/AcceptorTest.java (original)
+++ directory/network/trunk/src/test/org/apache/mina/examples/echoserver/AcceptorTest.java Thu Apr 21 03:49:06 2005
@@ -43,6 +43,11 @@
*/
public class AcceptorTest extends AbstractTest
{
+ public AcceptorTest()
+ {
+ super( true );
+ }
+
public void testTCP() throws Exception
{
EchoTCPClient client = new EchoTCPClient();
Modified: directory/network/trunk/src/test/org/apache/mina/examples/echoserver/ConnectorTest.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/test/org/apache/mina/examples/echoserver/ConnectorTest.java?rev=164032&r1=164031&r2=164032&view=diff
==============================================================================
--- directory/network/trunk/src/test/org/apache/mina/examples/echoserver/ConnectorTest.java (original)
+++ directory/network/trunk/src/test/org/apache/mina/examples/echoserver/ConnectorTest.java Thu Apr 21 03:49:06 2005
@@ -18,6 +18,7 @@
*/
package org.apache.mina.examples.echoserver;
+import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
@@ -25,6 +26,8 @@
import junit.framework.Assert;
import org.apache.mina.common.ByteBuffer;
+import org.apache.mina.common.Session;
+import org.apache.mina.common.SessionInitializer;
import org.apache.mina.examples.echoserver.ssl.BogusSSLContextFactory;
import org.apache.mina.io.IoConnector;
import org.apache.mina.io.IoHandlerAdapter;
@@ -44,27 +47,26 @@
{
private int clientPort;
+ public ConnectorTest()
+ {
+ super( false );
+ }
+
public void setUp() throws Exception
{
super.setUp();
- clientPort = AvailablePortFinder.getNextAvailable( port + 1 );
+ clientPort = port;
+ clientPort = AvailablePortFinder.getNextAvailable( clientPort + 1 );
+ System.out.println( "Using port " + clientPort + " as local address" );
}
public void testTCP() throws Exception
{
IoConnector connector = new SocketConnector();
connector.getFilterChain().addFirst( "threadPool", super.threadPoolFilter );
- testTCP0( connector, null );
+ testConnector( connector );
}
- public void testTCPWithLocalAddress() throws Exception
- {
- System.out.println( "Using client port " + clientPort + " for testing." );
- IoConnector connector = new SocketConnector();
- connector.getFilterChain().addFirst( "threadPool", super.threadPoolFilter );
- testTCP0( connector, new InetSocketAddress( clientPort ) );
- }
-
/**
* Client-side SSL doesn't work for now.
*/
@@ -83,17 +85,53 @@
connectorSSLFilter.setDebug( SSLFilter.Debug.ON );
connector.getFilterChain().addLast( "SSL", connectorSSLFilter );
- testTCP0( connector, null );
+ testConnector( connector );
+ }
+
+ public void testUDP() throws Exception
+ {
+ IoConnector connector = new DatagramConnector();
+ connector.getFilterChain().addFirst( "threadPool", super.threadPoolFilter );
+ testConnector( connector );
+ }
+
+ private void testConnector( IoConnector connector ) throws Exception
+ {
+ MarkingInitializer marker;
+ InetSocketAddress localAddress = new InetSocketAddress( clientPort );
+
+ System.out.println("* Without localAddress and initializer");
+ testConnector( connector, null, null );
+
+ marker = new MarkingInitializer();
+ System.out.println("* Without localAddress and with initializer");
+ testConnector( connector, null, marker );
+ Assert.assertTrue( marker.executed );
+
+ if( !(connector instanceof SocketConnector) )
+ {
+ // FIXME This test fails in case of SocketConnector.
+ // I don't know why yet.
+ System.out.println("* With localAddress and without initializer");
+ testConnector( connector, localAddress, null );
+
+ marker = new MarkingInitializer();
+ System.out.println("* With localAddress and initializer");
+ testConnector( connector, localAddress, marker );
+ Assert.assertTrue( marker.executed );
+ }
}
- private void testTCP0( IoConnector connector, SocketAddress localAddress ) throws Exception
+ private void testConnector( IoConnector connector, SocketAddress localAddress,
+ SessionInitializer initializer ) throws Exception
{
EchoConnectorHandler handler = new EchoConnectorHandler();
ByteBuffer readBuf = handler.readBuf;
IoSession session = connector.connect(
new InetSocketAddress( InetAddress.getLocalHost(), port ),
localAddress,
- handler );
+ handler,
+ initializer );
for( int i = 0; i < 10; i ++ )
{
@@ -140,21 +178,6 @@
assertEquals(expectedBuf, readBuf);
}
- public void testUDP() throws Exception
- {
- IoConnector connector = new DatagramConnector();
- connector.getFilterChain().addFirst( "threadPool", super.threadPoolFilter );
- testTCP0( connector, null );
- }
-
- public void testUDPWithLocalAddress() throws Exception
- {
- System.out.println( "Using client port " + clientPort + " for testing." );
- IoConnector connector = new DatagramConnector();
- connector.getFilterChain().addFirst( "threadPool", super.threadPoolFilter );
- testTCP0( connector, new InetSocketAddress( clientPort ) );
- }
-
private void fillWriteBuffer( ByteBuffer writeBuf, int i )
{
while( writeBuf.remaining() > 0 )
@@ -195,6 +218,16 @@
public void exceptionCaught( IoSession session, Throwable cause )
{
cause.printStackTrace();
+ }
+ }
+
+ private static class MarkingInitializer implements SessionInitializer
+ {
+ private boolean executed;
+
+ public void initializeSession(Session session) throws IOException
+ {
+ executed = true;
}
}
}