You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@mina.apache.org by "Trustin Lee (JIRA)" <ji...@apache.org> on 2007/01/30 09:37:33 UTC

[jira] Updated: (DIRMINA-342) TCP service not shutting down cleanly

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

Trustin Lee updated DIRMINA-342:
--------------------------------

    Attachment: TestBranch10.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.