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:33:27 UTC
[jira] [Closed] (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 closed DIRMINA-1013.
--------------------------------------
Should be fixed with http://git-wip-us.apache.org/repos/asf/mina/commit/849e22af
> 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)