[
https://issues.apache.org/jira/browse/DIRMINA-1057?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16195937#comment-16195937
]
Jonathan Valliere commented on DIRMINA-1057:
--------------------------------------------
Okay, sorry for all the edits of the previous comment.
Here is the deal.
* {{org.apache.mina.filter.codec.ProtocolCodecFilter}} produces two
WriteRequest objects for every 1 input.
* {{DefaultIoFilterChain$HeadFilter#filterWrite}} only called
{{increaseScheduledWriteMessages}} when {{getMessage()}} was not an instanceof
{{IoBuffer}} which causes other problems because File requests are transferred
down the {{fireMessageSent}} chain and cause the count to go negative also.
* {{DefaultIoFilterChain#fireMessageSent}} discriminates against Encoded
requests and will not allow them down the chain.
* {{AbstractPollingIoProcessor#writeBuffer}} contains a couple of errors when
dealing with empty write requests or null checks for the existance of an
OriginalRequest.
h3. *Fix HeadFilter*
{code:java}
public void filterWrite(NextFilter nextFilter, IoSession session, WriteRequest
writeRequest) throws Exception
{
AbstractIoSession s = (AbstractIoSession) session;
// Maintain counters.
if (writeRequest.getMessage() instanceof IoBuffer)
{
IoBuffer buffer = (IoBuffer)
writeRequest.getMessage();
// I/O processor implementation will call
buffer.reset()
// it after the write operation is finished,
because
// the buffer will be specified with
messageSent event.
buffer.mark();
int remaining = buffer.remaining();
if (remaining > 0)
{
s.increaseScheduledWriteBytes(remaining);
}
}
if (!writeRequest.isEncoded())
{
s.increaseScheduledWriteMessages();
}
WriteRequestQueue writeRequestQueue =
s.getWriteRequestQueue();
if (!s.isWriteSuspended())
{
if (writeRequestQueue.isEmpty(session))
{
// We can write directly the message
s.getProcessor().write(s, writeRequest);
}
else
{
s.getWriteRequestQueue().offer(s,
writeRequest);
s.getProcessor().flush(s);
}
}
else
{
s.getWriteRequestQueue().offer(s, writeRequest);
}
}
{code}
h3. *Fix AbstractPollingIoProcessor*
{code:java}
private int writeBuffer(S session, WriteRequest req, boolean hasFragmentation,
int maxLength, long currentTime) throws Exception
{
IoBuffer buf = (IoBuffer) req.getMessage();
int localWrittenBytes = 0;
if (buf.hasRemaining())
{
int length;
if (hasFragmentation)
{
length = Math.min(buf.remaining(), maxLength);
}
else
{
length = buf.remaining();
}
try
{
localWrittenBytes = this.write(session, buf,
length);
}
catch (IOException ioe)
{
ioe.printStackTrace();
// We have had an issue while trying to send
data to the
// peer : let's close the session.
buf.free();
session.closeNow();
this.removeNow(session);
return 0;
}
session.increaseWrittenBytes(localWrittenBytes,
currentTime);
// Now, forward the original message
if (!buf.hasRemaining() || (!hasFragmentation &&
(localWrittenBytes != 0)))
{
WriteRequest originalRequest =
req.getOriginalRequest();
if (originalRequest != null)
{
Object originalMessage =
req.getOriginalRequest().getMessage();
if (originalMessage instanceof IoBuffer)
{
buf = ((IoBuffer)
req.getOriginalRequest().getMessage());
int pos = buf.position();
buf.reset();
this.fireMessageSent(session,
req);
// And set it back to its
position
buf.position(pos);
}
else
{
this.fireMessageSent(session,
req);
}
}
else
{
this.fireMessageSent(session, req);
}
}
}
else
{
this.fireMessageSent(session, req);
}
return localWrittenBytes;
}
{code}
> 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)