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)