You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@mina.apache.org by "Emmanuel Lecharny (JIRA)" <ji...@apache.org> on 2015/10/07 18:30:26 UTC

[jira] [Resolved] (DIRMINA-1013) Threading model is supressed by ProtocolCodecFilter

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

Emmanuel Lecharny resolved DIRMINA-1013.
----------------------------------------
    Resolution: Fixed

Attached to the other issue.

> Threading model is supressed by ProtocolCodecFilter
> ---------------------------------------------------
>
>                 Key: DIRMINA-1013
>                 URL: https://issues.apache.org/jira/browse/DIRMINA-1013
>             Project: MINA
>          Issue Type: Bug
>          Components: Core, Filter
>    Affects Versions: 2.0.9
>         Environment: Windows 7 x32 
> Java(TM) SE Runtime Environment (build 1.8.0_45-b14) 
> Java HotSpot(TM) Client VM (build 25.45-b02, mixed mode, sharing)
>            Reporter: Marat Gainullin
>
> ProtocolCodecFilter.messageReceived uses a semaphore to protect the following critical section: 
> {code}
>                 lock.acquire();
>                 // Call the decoder with the read bytes
>                 decoder.decode(session, in, decoderOut);
>                 // Finish decoding if no exception was thrown.
>                 decoderOut.flush(nextFilter, session);
>                 ...
> {code}
> in such fragment of code:
> {code}
>         // Loop until we don't have anymore byte in the buffer,
>         // or until the decoder throws an unrecoverable exception or
>         // can't decoder a message, because there are not enough
>         // data in the buffer
>         while (in.hasRemaining()) {
>             int oldPos = in.position();
>             try {
>                 lock.acquire();
>                 // Call the decoder with the read bytes
>                 decoder.decode(session, in, decoderOut);
>                 // Finish decoding if no exception was thrown.
>                 decoderOut.flush(nextFilter, session);
>             } catch (Exception e) {
>                 ProtocolDecoderException pde;
>                 if (e instanceof ProtocolDecoderException) {
>                     pde = (ProtocolDecoderException) e;
>                 } else {
>                     pde = new ProtocolDecoderException(e);
>                 }
>                 if (pde.getHexdump() == null) {
>                     // Generate a message hex dump
>                     int curPos = in.position();
>                     in.position(oldPos);
>                     pde.setHexdump(in.getHexDump());
>                     in.position(curPos);
>                 }
>                 // Fire the exceptionCaught event.
>                 decoderOut.flush(nextFilter, session);
>                 nextFilter.exceptionCaught(session, pde);
>                 // Retry only if the type of the caught exception is
>                 // recoverable and the buffer position has changed.
>                 // We check buffer position additionally to prevent an
>                 // infinite loop.
>                 if (!(e instanceof RecoverableProtocolDecoderException) || (in.position() == oldPos)) {
>                     break;
>                 }
>             } finally {
>                 lock.release();
>             }
>         }
> {code}
> Using of semaphore
> {code}
> public class ProtocolCodecFilter extends IoFilterAdapter {
> ...
>     private final Semaphore lock = new Semaphore(1, true);
> {code}
> pushs other threads to wait while one of them is decoding. In MINA 2.0.7 there was a synchronized block at the same place, but on other point - decoderOut, wich is created per ioSession. Thus it was a stripped lock.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)