[
https://issues.apache.org/jira/browse/DIRMINA-342?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Trustin Lee updated DIRMINA-342:
--------------------------------
Attachment: TestTrunk.java
> TCP service not shutting down cleanly
> -------------------------------------
>
> Key: DIRMINA-342
> URL: https://issues.apache.org/jira/browse/DIRMINA-342
> Project: MINA
> Issue Type: Bug
> Components: Transport
> Affects Versions: 1.0.0, 1.0.1
> Reporter: Trustin Lee
> Priority: Minor
> Fix For: 1.0.2
>
> Attachments: TestBranch10.java, TestTrunk.java
>
>
> Summary:
> ========
> SocketAcceptor.unbind() works fine when an acceptor is unbound with no client
> connection, but it doesn't when with more than one client. Server closes all
> client connections after unbind operation is done, though we need to test all
> cases including:
> 1) unbinding with no connected client (no connection attempt at all,
> disconnectOnUnbind disabled)
> 2) unbinding with no connected client (client once connected, client closed
> the connection, disconnectOnUnbind disabled)
> 3) unbinding with no connected client (client once connected, server closed
> the connection, disconnectOnUnbind disabled)
> 4) unbinding with a connected client (disconnectOnUnbind disabled)
> Marc Boorshtein reported:
> ====================
> I hope everyone had a merry christmas and appoligies for sending this
> to both lists, but I thought it was applicable to both apacheds and
> mina.
> I am utilizing the mina start and stop code from the apacheds class
> "org.apache.directory.server.jndi.ServerContextFactory" in order to
> start my own server. The server starts OK, but when I try to stop the
> server and start it again I am given the exception:
> [2006-12-26 12:04:16,584][main] INFO Server - Starting server...
> [2006-12-26 12:04:16,909][main] ERROR Server - Could not bind to address
> java.net.BindException: Address already in use
> at sun.nio.ch.Net.bind(Native Method)
> at
> sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:119)
> at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:59)
> at
> org.apache.mina.transport.socket.nio.SocketAcceptor.registerNew(SocketAcceptor.java:442)
> at
> org.apache.mina.transport.socket.nio.SocketAcceptor.access$900(SocketAcceptor.java:52)
> at
> org.apache.mina.transport.socket.nio.SocketAcceptor$Worker.run(SocketAcceptor.java:268)
> at
> org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:43)
> at java.lang.Thread.run(Thread.java:595)
> Here is my startup code:
> LdapProtocolProvider protocolProvider = new
> LdapProtocolProvider(this.globalChain,this.router);
> // Disable the disconnection of the clients on unbind
> SocketAcceptorConfig acceptorCfg = new SocketAcceptorConfig();
> acceptorCfg.setDisconnectOnUnbind( false );
> acceptorCfg.setReuseAddress( true );
> acceptorCfg.setFilterChainBuilder( new
> DefaultIoFilterChainBuilder() );
> acceptorCfg.setThreadModel( threadModel );
>
> ((SocketSessionConfig)(acceptorCfg.getSessionConfig())).setTcpNoDelay(
> true );
> logger.debug("Port String : " + portString);
> logger.debug("Protocol Prpvider : " + protocolProvider);
> logger.debug("AcceptorConfig : " + acceptorCfg);
> logger.debug("tcpAcceptor : " + tcpAcceptor);
> tcpAcceptor = new SocketAcceptor();
> //try 3 times?
> for (int i=0;i<3;i++) {
> try {
> tcpAcceptor.bind( new InetSocketAddress(
> Integer.parseInt(portString) ), protocolProvider.getHandler(),
> acceptorCfg );
> break;
> } catch (java.net.BindException e) {
> logger.error("Could not bind to address",e);
> }
> }
> /*minaRegistry = new SimpleServiceRegistry();
> Service service = new Service( "ldap",
> TransportType.SOCKET, new
> InetSocketAddress( Integer.parseInt(portString) ) );
> */
> logger.debug("LDAP listener started");
> and here is my stop code
> try
> {
> // we should unbind the service before we begin sending the notice
> // of disconnect so new connections are not formed while we process
> List writeFutures = new ArrayList();
> // If the socket has already been unbound as with a successful
> // GracefulShutdownRequest then this will complain that the service
> // is not bound - this is ok because the GracefulShutdown
> has already
> // sent notices to to the existing active sessions
> List sessions = null;
> try
> {
> sessions = new ArrayList(
> tcpAcceptor.getManagedSessions( new InetSocketAddress( port ) ) );
> }
> catch ( IllegalArgumentException e )
> {
> logger.warn( "Seems like the LDAP service (" + port +
> ") has already been unbound." );
> return;
> }
> tcpAcceptor.unbind( new InetSocketAddress( port ) );
> if ( logger.isInfoEnabled() )
> {
> logger.info( "Unbind of an LDAP service (" + port + ") is
> complete." );
> logger.info( "Sending notice of disconnect to existing
> clients sessions." );
> }
> // Send Notification of Disconnection messages to all
> connected clients.
> if ( sessions != null )
> {
> for ( Iterator i = sessions.iterator(); i.hasNext(); )
> {
> IoSession session = ( IoSession ) i.next();
> writeFutures.add( session.write(
> NoticeOfDisconnect.UNAVAILABLE ) );
> }
> }
> // And close the connections when the NoDs are sent.
> Iterator sessionIt = sessions.iterator();
> for ( Iterator i = writeFutures.iterator(); i.hasNext(); )
> {
> WriteFuture future = ( WriteFuture ) i.next();
> future.join( 1000 );
> ( ( IoSession ) sessionIt.next() ).close();
> }
> }
> catch ( Exception e )
> {
> logger.warn( "Failed to sent NoD.", e );
> }
> Both snippets were taken nearly verbatim from the apacheds class.
> The issue only occurs if I have had clients connect to my server. For
> instance if I just start the server, stop it then start it again it
> works just fine. However if I start the server, run a search and then
> stop it again this problem ocurrs. As a side note, this server was
> originally written against apacheds 0.9.8 and which ever version of
> MINA that version came with and I never ran into this problem. Any
> help would be greatly appreciated.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.