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/28 05:57:49 UTC

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

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.1, 1.0.0
            Reporter: Trustin Lee
            Priority: Minor
             Fix For: 1.0.2


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.


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

Posted by "Trustin Lee (JIRA)" <ji...@apache.org>.
     [ 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.


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

Posted by "Trustin Lee (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/DIRMINA-342?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Trustin Lee resolved DIRMINA-342.
---------------------------------

    Resolution: Won't Fix

According to the reporter (Marc), this problem occurs when JVM process is *killed* by kill command.  We don't have any control on such a situation and it's what JVM is supposed to take care of.  I mark it as 'won't fix'.  and I was not able to reproduce this issue in my machine.

> 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.


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

Posted by "Trustin Lee (JIRA)" <ji...@apache.org>.
     [ 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.


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

Posted by "Trustin Lee (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/DIRMINA-342?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Trustin Lee closed DIRMINA-342.
-------------------------------

       Resolution: Duplicate
    Fix Version/s:     (was: 1.0.2)
                   1.0.3

DIRMINA-366 describes this issue much better.

> 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
>         Assigned To: Trustin Lee
>            Priority: Minor
>             Fix For: 1.0.3
>
>         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.


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

Posted by "Trustin Lee (JIRA)" <ji...@apache.org>.
    [ https://issues.apache.org/jira/browse/DIRMINA-342?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12468537 ] 

Trustin Lee commented on DIRMINA-342:
-------------------------------------

I attached a test code that performs all possible 5 scenarios to reproduce the problem.  I gave 1 second delay per each re-binding to make sure JVM have some time to release resources because JVM releases resources a little bit later when non-blocking channel is used.

I couldn't reproduce the problem in my Ubuntu Edgy Eft (6.10), Dual Core Opteron Dual (32-bit mode), even with an infinite loop.  I also couldn't find any important difference in code between old version (0.9.5) and the latest version.  Should I separate a client and a server physically?

> 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.


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

Posted by "Trustin Lee (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/DIRMINA-342?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Trustin Lee reopened DIRMINA-342:
---------------------------------

      Assignee: Trustin Lee

> 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
>         Assigned To: 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.