You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@mina.apache.org by "Marat Gainullin (JIRA)" <ji...@apache.org> on 2015/06/04 16:26:38 UTC
[jira] [Created] (DIRMINA-1013) Threading model is supressed by
ProtocolCodecFilter
Marat Gainullin created DIRMINA-1013:
----------------------------------------
Summary: 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. Now
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)