You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@mina.apache.org by "Ben (JIRA)" <ji...@apache.org> on 2010/11/03 19:46:24 UTC

[jira] Commented: (DIRMINA-807) Deadlock with NioDatagramAcceptor/Udp (Compilable code inlined showing issue)

    [ https://issues.apache.org/jira/browse/DIRMINA-807?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12927951#action_12927951 ] 

Ben commented on DIRMINA-807:
-----------------------------

Not sure if it helps, but compiled and ran the code on Mac OSX 10.6.4 with the same outcome (seems stuck on acceptor.bind(...) only when an IoServiceListener is added).  Just stared using Mina, but didn't see anything wrong in the code provided.

> Deadlock with NioDatagramAcceptor/Udp (Compilable code inlined showing issue)
> -----------------------------------------------------------------------------
>
>                 Key: DIRMINA-807
>                 URL: https://issues.apache.org/jira/browse/DIRMINA-807
>             Project: MINA
>          Issue Type: Bug
>          Components: Core
>    Affects Versions: 2.0.0
>         Environment: Windows XP Service Pack 3 (32bit)
>            Reporter: Jason
>            Priority: Blocker
>
> NOTE: This issue occurs with 2.0.0 and 2.0.1
> Comment out the addListener and apparent Deadlock goes away.
>        final IoServiceListener listener = new UdpIoServiceListener();
>        // APACHE: THIS CREATES A DEADLOCK
>        acceptor.addListener(listener);
> When the listener is added bind never returns.
>        acceptor.bind(new InetSocketAddress(12345));
> If you comment out the addListener, bind returns and you will see
> the System.out..
> (Compilable code inlined showing issue)
> [BEGIN]
> import java.io.IOException;
> import java.net.InetSocketAddress;
> import java.net.SocketAddress;
> import java.util.Set;
> import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
> import org.apache.mina.core.service.IoHandlerAdapter;
> import org.apache.mina.core.service.IoService;
> import org.apache.mina.core.service.IoServiceListener;
> import org.apache.mina.core.session.IdleStatus;
> import org.apache.mina.core.session.IoSession;
> import org.apache.mina.filter.logging.LoggingFilter;
> import org.apache.mina.transport.socket.DatagramSessionConfig;
> import org.apache.mina.transport.socket.nio.NioDatagramAcceptor;
> public class UdpBug {
>    public static class UdpIoServiceListener implements IoServiceListener {
>        @Override
>        public void serviceActivated(final IoService service) throws Exception {
>            System.out.println("UdpServiceListener#serviceActivated service: " + service);
>        }
>        @Override
>        public void serviceDeactivated(final IoService service) throws Exception {
>            System.out.println("UdpServiceListener#serviceDeactivated service: " + service);
>        }
>        @Override
>        public void serviceIdle(final IoService service, final IdleStatus status) throws Exception {
>            System.out.println("UdpServiceListener#serviceIdle service: " + service + " status: " + status);
>        }
>        @Override
>        public void sessionCreated(final IoSession session) throws Exception {
>            System.out.println("UdpServiceListener#sessionCreated session: " + session);
>        }
>        @Override
>        public void sessionDestroyed(final IoSession session) throws Exception {
>            System.out.println("UdpServiceListener#sessionDestroyed session: " + session);
>        }
>    }
>    public static class UdpIoHandler extends IoHandlerAdapter {
>        public UdpIoHandler() {
>        }
>        @Override
>        public void sessionCreated(final IoSession session) throws Exception {
>            System.out.println("UdpIoHandler#sessionCreated session: " + session);
>            session.getConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);
>        }
>        @Override
>        public void sessionOpened(final IoSession session) throws Exception {
>            System.out.println("UdpIoHandler#sessionOpened session: " + session);
>        }
>        @Override
>        public void sessionClosed(final IoSession session) throws Exception {
>            System.out.println("UdpIoHandler#sessionClosed session: " + session);
>        }
>        @Override
>        public void sessionIdle(final IoSession session, final IdleStatus status) throws Exception {
>            System.out.println("UdpIoHandler#sessionCreated session: " + session + " status: " + status);
>            session.close(true);
>        }
>        @Override
>        public void exceptionCaught(final IoSession session, final Throwable cause) throws Exception {
>            System.out.println("UdpIoHandler#exceptionCaught session: " + session + " cause: " + cause);
>            session.close(true);
>        }
>        @Override
>        public void messageReceived(final IoSession session, final Object message) throws Exception {
>            System.out.println("UdpIoHandler#messageReceived session: " + session + " message: " + message);
>        }
>    }
>    public static final void main(String[] args) throws IOException {
>        // ByteBuffer.setUseDirectBuffers(false);
>        NioDatagramAcceptor acceptor = new NioDatagramAcceptor();
>        acceptor.setCloseOnDeactivation(true);
>        final IoServiceListener listener = new UdpIoServiceListener();
>        // APACHE: THIS CREATES A DEADLOCK
>        acceptor.addListener(listener);
>        final DatagramSessionConfig sessionConfig = acceptor.getSessionConfig();
>        sessionConfig.setReuseAddress(true);
>        final DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
>        final LoggingFilter loggingFilter = new LoggingFilter();
>        chain.addLast("logFilter", loggingFilter);
>        // acceptor.setFilterChainBuilder(chain);
>        acceptor.setHandler(new UdpIoHandler());
>        acceptor.bind(new InetSocketAddress(12345));
>        final Set<SocketAddress> addrs = acceptor.getLocalAddresses();
>        for (final SocketAddress addr : addrs) {
>            System.out.println("UdpServer.start " + addr.toString());
>        }
>        System.out.println("UdpServer started on port " + 12345);
>    }
> }
> [END] 

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.