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

Jonathan Valliere edited comment on DIRMINA-1057 at 10/7/17 7:34 PM:
---------------------------------------------------------------------

Okay, looks like I found a condition where fireMessageSent can occur more than 
once per WriteRequest causing the counter to go negative.


{code:java}
                int localWrittenBytes = send(session, buf, destination);

                if ((localWrittenBytes == 0) || (writtenBytes >= 
maxWrittenBytes)) {
                    // Kernel buffer is full or wrote too much
                    setInterestedInWrite(session, true);

                    session.getWriteRequestQueue().offer(session, writeRequest);
                    scheduleFlush(session);
                } else {
                    setInterestedInWrite(session, false);

                    // Clear and fire event
                    session.setCurrentWriteRequest(null);
                    writtenBytes += localWrittenBytes;
                    buf.reset();
                    session.getFilterChain().fireMessageSent(writeRequest);

                    break;
                }
{code}

Should be


{code:java}
                int localWrittenBytes = send(session, buf, destination);
                
                if(localWrittenBytes > 0 )
                        writtenBytes += localWrittenBytes;

                if ((localWrittenBytes == 0) || buf.hasRemaining() || 
(writtenBytes >= maxWrittenBytes)) {
                    // Kernel buffer is full or wrote too much
                    setInterestedInWrite(session, true);

                    session.getWriteRequestQueue().offer(session, writeRequest);
                    scheduleFlush(session);
                    
                    break;
                } else {
                    setInterestedInWrite(session, false);

                    // Clear and fire event
                    session.setCurrentWriteRequest(null);
                    buf.reset();
                    session.getFilterChain().fireMessageSent(writeRequest);

                    break;
                }
{code}

Basically what I think is happening is that the buffer had written data; it got 
caught by the condition then was re-added back to the queue.  The for... loop 
cycled found no data was remaining and called fireMessageSent not knowing that 
it still existed in the Queue.  So, later the same message was sent again.

The fix checks for buf.hasRemaining() and breaks out of the loop when a "bad 
write" condition is met.  It also fixes the maxWrittenBytes condition which 
would never fail otherwise because it wasn't being incremented in a functioning 
part of the loop.



was (Author: johnnyv):
Okay, looks like I found a condition where fireMessageSent can occur more than 
once per WriteRequest causing the counter to go negative.


{code:java}
                int localWrittenBytes = send(session, buf, destination);

                if ((localWrittenBytes == 0) || (writtenBytes >= 
maxWrittenBytes)) {
                    // Kernel buffer is full or wrote too much
                    setInterestedInWrite(session, true);

                    session.getWriteRequestQueue().offer(session, writeRequest);
                    scheduleFlush(session);
                } else {
                    setInterestedInWrite(session, false);

                    // Clear and fire event
                    session.setCurrentWriteRequest(null);
                    writtenBytes += localWrittenBytes;
                    buf.reset();
                    session.getFilterChain().fireMessageSent(writeRequest);

                    break;
                }
{code}

Should be


{code:java}
 int localWrittenBytes = send(session, buf, destination);
                
                if(localWrittenBytes > 0)
                        writtenBytes += localWrittenBytes;

                if ((localWrittenBytes == 0) || buf.hasRemaining() || 
(writtenBytes >= maxWrittenBytes)) {
                    // Kernel buffer is full or wrote too much
                    setInterestedInWrite(session, true);

                    session.getWriteRequestQueue().offer(session, writeRequest);
                    scheduleFlush(session);
                } else {
                    setInterestedInWrite(session, false);

                    // Clear and fire event
                    session.setCurrentWriteRequest(null);
                    buf.reset();
                    session.getFilterChain().fireMessageSent(writeRequest);

                    break;
                }
{code}

Basically what I think is happening is that the buffer had written data; it got 
caught by the condition then was re-added back to the queue.  The for... loop 
cycled found no data was remaining and called fireMessageSent not knowing that 
it still existed in the Queue.  So, later the same message was sent again.


> AbstractIoSession getScheduledWriteMessages always -negative?
> -------------------------------------------------------------
>
>                 Key: DIRMINA-1057
>                 URL: https://issues.apache.org/jira/browse/DIRMINA-1057
>             Project: MINA
>          Issue Type: Bug
>          Components: Core
>    Affects Versions: 2.0.16
>         Environment: I'm testing slow consumer backlog detection and while 
> getScheduledWriteBytes() correctly grows, getScheduledWriteMessages is always 
> negative and does not increase. looking into code to see why but putting bug 
> report here as well for tracking
>            Reporter: Andre Mermegas
>




--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Reply via email to