[ 
https://issues.apache.org/jira/browse/DIRMINA-1040?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15405485#comment-15405485
 ] 

Silver Cheng commented on DIRMINA-1040:
---------------------------------------

{noformat}
  private int writeBuffer(S session, WriteRequest req, boolean 
hasFragmentation, int maxLength, long currentTime)
            throws Exception {
        IoBuffer buf = (IoBuffer) req.getMessage();
        int localWrittenBytes = 0;
        
        //add by silver
        if (DEBUG) {
            LOGGER.debug( "***3 Mina AbstractPollingIoProcessor writeBuffer  
session's hasFragmentation: {} ;  session: {}; ", 
hasFragmentation,session.getCurrentWriteMessage());
            LOGGER.debug( "***3 Mina AbstractPollingIoProcessor writeBuffer  
session's maxWrittenBytes: {} ;  buf: {};", maxLength,buf.getHexDump());
            }

        if (buf.hasRemaining()) {
            int length;

            if (hasFragmentation) {
                length = Math.min(buf.remaining(), maxLength);
            } else {
                length = buf.remaining();
            }

            try {
                localWrittenBytes = write(session, buf, length);
            } catch (IOException ioe) {
                // We have had an issue while trying to send data to the
                // peer : let's close the session.
                buf.free();
                session.close(true);
                destroy(session);

                return 0;
            }

        }

        session.increaseWrittenBytes(localWrittenBytes, currentTime);
        //add by silver
        if(localWrittenBytes!=0){
                if (DEBUG) {
            LOGGER.debug( "***5.0  After NioProcessor write method, in Mina 
AbstractPollingIoProcessor writeBuffer  session's localWrittenBytes: {}  ", 
localWrittenBytes);
            }
        }else{
                if (DEBUG) {
            LOGGER.debug( "***5.1  After NioProcessor write method, in Mina 
AbstractPollingIoProcessor writeBuffer  session's localWrittenBytes is ZERO ");
            }
        }

        if (!buf.hasRemaining() || (!hasFragmentation && (localWrittenBytes != 
0))) {
            // Buffer has been sent, clear the current request.
            int pos = buf.position();
            buf.reset();

            fireMessageSent(session, req);

            // And set it back to its position
            buf.position(pos);
        }

        return localWrittenBytes;
    }
{noformat}

below wirte method I only print the  session.getCurrentWriteMessage, not the  
session.getCurrentWriteRequest, not sure what's the difference between them, 
but the pos may be diff . 

{noformat}
  @Override
    protected int write(NioSession session, IoBuffer buf, int length) throws 
Exception {
        if (buf.remaining() <= length) {
                //add by silver
                if (DEBUG) {
                Object msg = session.getCurrentWriteMessage();           
                LOGGER.debug( "***4.0 Enter Mina NioProcessor write method 
buf.remaining: {}; msg: {};", buf.remaining(), msg);
                LOGGER.debug( "***4.0 Enter Mina NioProcessor write method 
length: {};buf: {}", length,buf.getHexDump());            
            } 

            return session.getChannel().write(buf.buf());
        }

        int oldLimit = buf.limit();
        buf.limit(buf.position() + length);
        try {
                //add by silver
                if (DEBUG) {
                Object msg = session.getCurrentWriteMessage();           
                LOGGER.debug( "***4.1 Enter Mina NioProcessor write method msg: 
{};", msg);
                LOGGER.debug( "***4.1 Enter Mina NioProcessor write method 
length: {};buf: {}", length,buf.getHexDump());            
            }

            return session.getChannel().write(buf.buf());
        } finally {
            buf.limit(oldLimit);
        }
    }

{noformat}




> Mina 2.0.4 truncated the PDU
> ----------------------------
>
>                 Key: DIRMINA-1040
>                 URL: https://issues.apache.org/jira/browse/DIRMINA-1040
>             Project: MINA
>          Issue Type: Bug
>          Components: Filter
>    Affects Versions: 2.0.4
>         Environment: Mina 2.0.4 version
> pl-1@ECE8000-Z1 ~ # /usr/java/latest/bin/java -version
> java version "1.6.0_45"
> Java(TM) SE Runtime Environment (build 1.6.0_45-b06)
> Java HotSpot(TM) 64-Bit Server VM (build 20.45-b01, mixed mode)
>            Reporter: Silver Cheng
>              Labels: PDU, truncated
>         Attachments: Mina-2.0.13-code delta.docx, mina log and tcpdump.zip, 
> mina-debug-logging.zip, tcpdump-10001.zip
>
>
> Background:
> our app messaging-server is to handle the SMPP protocol messages, and we use 
> Mina 2.0.4 for the lower TCP transport function.
> Problem:
> sometime, not often, I found that the PDU could be truncated by Mina from 
> tcpdump. I added some debug loggers to mina codes, and found that indeed the 
> PDU truncated is occuring at Mina. 
> from below logs, you can see in #3, the buf which got from WriteRequest got 
> truncated the first 16 bytes in Mina.  could you know if it's a known issue 
> in 2.0.4?
> Debug loggers & Logs: 
> 1. IoHandler:
>         WriteFuture future = iosession.write(deliverSm);
> 2016-07-14 01:52:19,865 DEBUG (62451235@WebForward 0.0.0.0:5001-21) 
> (bbfa6690c88ab98aec4e) com.ipx.cpsmscapis.smpp.NorthSmppIoHandler - Sending 
> DeliverSM: 00 00 00 be 00 00 00 05 00 00 00 00 00 00 03 02 00 01 01 31 32 30 
> 32 34 36 30 38 39 33 33 00 04 09 37 36 32 32 36 35 00 04 00 00 00 00 00 00 00 
> 00 6f 69 64 3a 32 31 36 30 37 31 34 30 31 30 30 31 32 34 32 32 38 35 38 20 73 
> 75 62 3a 30 30 31 20 64 6c 76 72 64 3a 30 30 31 20 73 75 62 6d 69 74 20 64 61 
> 74 65 3a 31 36 30 37 31 34 30 31 35 32 20 64 6f 6e 65 20 64 61 74 65 3a 31 36 
> 30 37 31 34 30 31 35 32 20 73 74 61 74 3a 44 45 4c 49 56 52 44 20 65 72 72 3a 
> 30 30 30 20 74 65 78 74 3a 04 27 00 01 02 00 1e 00 14 32 31 36 30 37 31 34 30 
> 31 30 30 31 32 34 32 32 38 35 38 00
> 2. AbstractIoSession:
>     public WriteFuture write(Object message, SocketAddress remoteAddress) {
>         if (message == null) {
>             throw new IllegalArgumentException("message");
>         }
>         
>       //added by Silver
>         if (DEBUG) {
>               if 
> (message.getClass().getName().equals("org.smpp.pdu.DeliverSM")) {
>                       LOGGER.debug( "***1 Enter Mina AbstractIoSession write 
> method Object message: {};",message);
>               }               
>         }
> 2016-07-14 01:52:19,866 DEBUG (62451235@WebForward 0.0.0.0:5001-21) 
> (bbfa6690c88ab98aec4e) org.apache.mina.core.session.AbstractIoSession - ***1 
> Enter Mina AbstractIoSession write method Object message: 00 00 00 be 00 00 
> 00 05 00 00 00 00 00 00 03 02 00 01 01 31 32 30 32 34 36 30 38 39 33 33 00 04 
> 09 37 36 32 32 36 35 00 04 00 00 00 00 00 00 00 00 6f 69 64 3a 32 31 36 30 37 
> 31 34 30 31 30 30 31 32 34 32 32 38 35 38 20 73 75 62 3a 30 30 31 20 64 6c 76 
> 72 64 3a 30 30 31 20 73 75 62 6d 69 74 20 64 61 74 65 3a 31 36 30 37 31 34 30 
> 31 35 32 20 64 6f 6e 65 20 64 61 74 65 3a 31 36 30 37 31 34 30 31 35 32 20 73 
> 74 61 74 3a 44 45 4c 49 56 52 44 20 65 72 72 3a 30 30 30 20 74 65 78 74 3a 04 
> 27 00 01 02 00 1e 00 14 32 31 36 30 37 31 34 30 31 30 30 31 32 34 32 32 38 35 
> 38 00;
> 3. AbstractPollingIoProcessor:
>     private int writeBuffer(S session, WriteRequest req,
>             boolean hasFragmentation, int maxLength, long currentTime)
>             throws Exception {
>         IoBuffer buf = (IoBuffer) req.getMessage();
>         
>         //add by silver
>         if (DEBUG) {
>             LOGGER.debug( "***3 Mina AbstractPollingIoProcessor writeBuffer  
> session's hasFragmentation: {} ;  session: {}; ", 
> hasFragmentation,session.getCurrentWriteMessage());
>             LOGGER.debug( "***3 Mina AbstractPollingIoProcessor writeBuffer  
> session's maxWrittenBytes: {} ;  buf: {};", maxLength,buf.getHexDump());
>             }
> 2016-07-14 01:52:19,866 DEBUG (NioProcessor-3) () 
> org.apache.mina.core.polling.AbstractPollingIoProcessor - ***3 Mina 
> AbstractPollingIoProcessor writeBuffer  session's maxWrittenBytes: 98304 ;  
> buf: 00 01 01 31 32 30 32 34 36 30 38 39 33 33 00 04 09 37 36 32 32 36 35 00 
> 04 00 00 00 00 00 00 00 00 6F 69 64 3A 32 31 36 30 37 31 34 30 31 30 30 31 32 
> 34 32 32 38 35 38 20 73 75 62 3A 30 30 31 20 64 6C 76 72 64 3A 30 30 31 20 73 
> 75 62 6D 69 74 20 64 61 74 65 3A 31 36 30 37 31 34 30 31 35 32 20 64 6F 6E 65 
> 20 64 61 74 65 3A 31 36 30 37 31 34 30 31 35 32 20 73 74 61 74 3A 44 45 4C 49 
> 56 52 44 20 65 72 72 3A 30 30 30 20 74 65 78 74 3A 04 27 00 01 02 00 1E 00 14 
> 32 31 36 30 37 31 34 30 31 30 30 31 32 34 32 32 38 35 38 00;



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

Reply via email to