You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@mina.apache.org by sishen <si...@gmail.com> on 2007/01/23 11:44:46 UTC

The server stop response. dead lock?

In my application,  i use mina 1.1 version.

Now i do some perfermance test.  Below is my test case.

loop (50) {
     client send message to server. (500 client one time).
     sleep 1s.
}

And  in the executing,  the server stop response. It just hang.  However,
sometimes it passed the test.

I sniff the network using tcpdump.  And i found that the packet is received
by the server machine, but no log output in the code decode part.
So I think it even don't go to the doDecode step. It's very strange, and i
don't know the reason.

Thank you for you advice. Below is the related code.

The code of server side:

public class BIIServer {
    private static final int port = 12345;
    private static BIIServerSessionHandler handler = new
BIIServerSessionHandler();

    public static void main(String[] args) throws Exception
    {
        try {
            Executor executor = Executors.newCachedThreadPool();
            SocketAcceptor acceptor = new
SocketAcceptor(Runtime.getRuntime().availableProcessors(),
executor);
            ExecutorThreadModel model = ExecutorThreadModel.getInstance
("BIIServer");
            model.setExecutor(executor);
            acceptor.getFilterChain().addLast("codec", new
ProtocolCodecFilter(new BIProtocolCodecFactory(true)));
            acceptor.getFilterChain().addLast("threadpool", new
ExecutorFilter(executor));
            SocketAcceptorConfig config = new SocketAcceptorConfig();
            config.setReuseAddress(true);
            acceptor.bind(new InetSocketAddress(port), handler, config);
            System.out.println("Server now listening on port: " + port);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

The code of client side:

    public UIDMessage orderUID(OrderUIDMessage message) {
        IoSession session;
        Object lock = new Object();
        for ( ; ; ) {
            try {
                ConnectFuture future = connector.connect(new
InetSocketAddress(host, port), handler, cfg);
                future.join();
                session = future.getSession();
                session.setAttribute("lock", lock);
                break;
            } catch (RuntimeIOException ex) {
            } catch (InterruptedException e) {
            }
        }
        session.write(message);
        synchronized (lock) {
            try {
                while (session.getAttachment() == null) {
                    lock.wait();                    <-   I use this to
ensure i receive the result message.  But due to the problem, it was made to
wait indefinitely.
                }
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }
        }
        UIDMessage UID = (UIDMessage)session.removeAttribute("");
        sessionMap.put(UID.getUid(), session);
        return UID;
    }

Fwd: The server stop response. dead lock?

Posted by sishen <si...@gmail.com>.
---------- Forwarded message ----------
From: sishen <si...@gmail.com>
Date: Jan 23, 2007 6:44 PM
Subject: The server stop response. dead lock?
To: mina-dev@directory.apache.org

In my application,  i use mina 1.1 version.

Now i do some perfermance test.  Below is my test case.

loop (50) {
     client send message to server. (500 client one time).
     sleep 1s.
}

And  in the executing,  the server stop response. It just hang.  However,
sometimes it passed the test.

I sniff the network using tcpdump.  And i found that the packet is received
by the server machine, but no log output in the code decode part.
So I think it even don't go to the doDecode step. It's very strange, and i
don't know the reason.

Thank you for you advice. Below is the related code.

The code of server side:

public class BIIServer {
    private static final int port = 12345;
    private static BIIServerSessionHandler handler = new
BIIServerSessionHandler();

    public static void main(String[] args) throws Exception
    {
        try {
            Executor executor = Executors.newCachedThreadPool();
            SocketAcceptor acceptor = new SocketAcceptor(
Runtime.getRuntime().availableProcessors(),
executor);
            ExecutorThreadModel model = ExecutorThreadModel.getInstance
("BIIServer");
            model.setExecutor(executor);
            acceptor.getFilterChain ().addLast("codec", new
ProtocolCodecFilter(new BIProtocolCodecFactory(true)));
            acceptor.getFilterChain().addLast("threadpool", new
ExecutorFilter(executor));
            SocketAcceptorConfig config = new SocketAcceptorConfig();
            config.setReuseAddress(true);
            acceptor.bind(new InetSocketAddress(port), handler, config);
            System.out.println("Server now listening on port: " + port);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

The code of client side:

    public UIDMessage orderUID(OrderUIDMessage message) {
        IoSession session;
        Object lock = new Object();
        for ( ; ; ) {
            try {
                ConnectFuture future = connector.connect(new
InetSocketAddress(host, port), handler, cfg);
                future.join();
                session = future.getSession ();
                session.setAttribute("lock", lock);
                break;
            } catch (RuntimeIOException ex) {
            } catch (InterruptedException e) {
            }
        }
        session.write(message);
        synchronized (lock) {
            try {
                while (session.getAttachment() == null) {
                    lock.wait();                    <-   I use this to
ensure i receive the result message.  But due to the problem, it was made to
wait indefinitely.
                }
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }
        }
        UIDMessage UID = (UIDMessage)session.removeAttribute("");
        sessionMap.put(UID.getUid(), session);
        return UID;
    }

Re: The server stop response. dead lock?

Posted by Trustin Lee <tr...@gmail.com>.
http://mina.apache.org/reporting-a-bug.html

On 1/23/07, sishen <si...@gmail.com> wrote:
>
> In my application,  i use mina 1.1 version.
>
> Now i do some perfermance test.  Below is my test case.
>
> loop (50) {
>      client send message to server. (500 client one time).
>      sleep 1s.
> }
>
> And  in the executing,  the server stop response. It just hang.  However,
> sometimes it passed the test.
>
> I sniff the network using tcpdump.  And i found that the packet is
> received
> by the server machine, but no log output in the code decode part.
> So I think it even don't go to the doDecode step. It's very strange, and i
>
> don't know the reason.
>
> Thank you for you advice. Below is the related code.
>
> The code of server side:
>
> public class BIIServer {
>     private static final int port = 12345;
>     private static BIIServerSessionHandler handler = new
> BIIServerSessionHandler();
>
>     public static void main(String[] args) throws Exception
>     {
>         try {
>             Executor executor = Executors.newCachedThreadPool();
>             SocketAcceptor acceptor = new
> SocketAcceptor(Runtime.getRuntime().availableProcessors(),
> executor);
>             ExecutorThreadModel model = ExecutorThreadModel.getInstance
> ("BIIServer");
>             model.setExecutor(executor);
>             acceptor.getFilterChain().addLast("codec", new
> ProtocolCodecFilter(new BIProtocolCodecFactory(true)));
>             acceptor.getFilterChain().addLast("threadpool", new
> ExecutorFilter(executor));
>             SocketAcceptorConfig config = new SocketAcceptorConfig();
>             config.setReuseAddress(true);
>             acceptor.bind(new InetSocketAddress(port), handler, config);
>             System.out.println ("Server now listening on port: " + port);
>         } catch (Exception ex) {
>             ex.printStackTrace();
>         }
>     }
> }
>
> The code of client side:
>
>     public UIDMessage orderUID(OrderUIDMessage message) {
>         IoSession session;
>         Object lock = new Object();
>         for ( ; ; ) {
>             try {
>                 ConnectFuture future = connector.connect(new
> InetSocketAddress(host, port), handler, cfg);
>                 future.join();
>                 session = future.getSession();
>                 session.setAttribute("lock", lock);
>                 break;
>             } catch (RuntimeIOException ex) {
>             } catch (InterruptedException e) {
>             }
>         }
>         session.write(message);
>         synchronized (lock) {
>             try {
>                 while (session.getAttachment() == null) {
>                     lock.wait();                    <-   I use this to
> ensure i receive the result message.  But due to the problem, it was made
> to
> wait indefinitely.
>                 }
>             } catch (InterruptedException ex) {
>                 ex.printStackTrace();
>             }
>         }
>         UIDMessage UID = (UIDMessage)session.removeAttribute("");
>         sessionMap.put(UID.getUid(), session);
>         return UID;
>     }
>
>


-- 
what we call human nature is actually human habit
--
http://gleamynode.net/
--
PGP key fingerprints:
* E167 E6AF E73A CBCE EE41  4A29 544D DE48 FE95 4E7E
* B693 628E 6047 4F8F CFA4  455E 1C62 A7DC 0255 ECA6