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)" <tr...@gmail.com> on 2008/03/10 08:49:13 UTC
Re: VmPipeConnector Initialisation order
2008-01-25 (금), 12:34 -0800, hborders 쓰시길:
>
> Trustin Lee wrote:
> >
> > If you take a look into the VmPipeFilterChain, there's a queue for such a
> > case:
> >
> > ...
> >
> > So, I think it will work fine without causing a dead lock or
> > messageReceived event to be fired before sessionOpened is fired. Does
> > it make sense?
> >
>
> In a VmPipe, I've run into some problems with sessionCreated not completing
> before sessionOpened and messageReceived are called. I thought that mina
> guaranteed that sessionCreated would be completed before sessionOpened and
> messageReceived. I think this stems from the following code in
> ExecutorFilter:
>
> public void sessionCreated(NextFilter nextFilter, IoSession session) {
> nextFilter.sessionCreated(session);
> }
>
> All other event handlers run the nextFilter a separate thread thusly:
>
> public void sessionOpened(NextFilter nextFilter, IoSession session) {
> fireEvent(nextFilter, session, EventType.OPENED, null);
> }
>
>
> The issue appears if the VmPipeConnector writes a message while the
> VmPipeAcceptor's IoHandler is still envoking sessionCreated.
>
> The program below illustrates the problem. It outputs a String with events
> appended in the order they finish. We would expect it to print
> "sessionCreated, sessionOpened, messageReceived, ", but it prints
> "sessionOpened, messageReceived, sessionCreated, ".
>
> public class VmPipeSessionCreatedTimingBug {
> public static void main(String[] args) throws Exception {
> final Semaphore semaphore = new Semaphore(0);
> final StringBuffer stringBuffer = new StringBuffer();
> VmPipeAcceptor vmPipeAcceptor = new VmPipeAcceptor();
> final VmPipeAddress vmPipeAddress = new VmPipeAddress(12345);
> vmPipeAcceptor.bind(vmPipeAddress, new IoHandlerAdapter() {
> @Override
> public void sessionCreated(IoSession session) throws Exception {
> // pretend we are doing some time-consuming work. For
> // performance reasons, you would never want to do time
> // consuming work in sessionCreated.
> // However, this increases the likelihood of the timing bug.
> Thread.sleep(5000);
> stringBuffer.append("sessionCreated, ");
> }
>
> @Override
> public void sessionOpened(IoSession session) throws Exception {
> Thread.sleep(1000);
> stringBuffer.append("sessionOpened, ");
> }
>
> @Override
> public void messageReceived(IoSession session, Object message)
> throws Exception {
> stringBuffer.append("messageReceived, ");
> semaphore.release();
> }
> });
>
> final VmPipeConnector vmPipeConnector = new VmPipeConnector();
> ConnectFuture connectFuture = vmPipeConnector.connect(vmPipeAddress,
> new IoHandlerAdapter() {
> @Override
> public void sessionOpened(IoSession session)
> throws Exception {
> session.write(ByteBuffer.wrap(new byte[1]));
> }
> });
>
> semaphore.tryAcquire(5, TimeUnit.SECONDS);
> connectFuture.getSession().close();
> vmPipeAcceptor.unbindAll();
>
> System.out.println(stringBuffer);
> }
> }
Thanks for the detailed report. I succeeded to reproduce the problem,
and you can track this issue here:
https://issues.apache.org/jira/browse/DIRMINA-543
--
Trustin Lee - Principal Software Engineer, JBoss, Red Hat
--
what we call human nature is actually human habit
--
http://gleamynode.net/