Folks,
First of all, before going any further, many thanks to the MINA team for
delivering such a useful toolkit for Java NIO development. We have had
tremendous success with it to date. :-)
However, we recently encountered an issue with
AbstractPollingIoProcessor.flushNow(T session, long currentTime) in version
2.0-M2. On Linux, large writes seem to flush and then stall for a while
before letting more writes through. Further inspection of this method
revealed a fix specific to Java on Linux for large files as follows:
} else if (message instanceof FileRegion) {
localWrittenBytes = writeFile(
session, req, hasFragmentation,
maxWrittenBytes - writtenBytes,
currentTime);
* // Fix for Java bug on Linux
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5103988
// If there's still data to be written in the FileRegion,
return 0 indicating that we need
// to pause until writing may resume.
if (localWrittenBytes > 0 && ((FileRegion)
message).getRemainingBytes() > 0) {
writtenBytes += localWrittenBytes;
setInterestedInWrite(session, true);
return false;
}
* } else {
Looking at the Java BugDB, it seems to be a general issue with large writes,
so a large IoBuffer would also have the same issue with Java on Linux. We
added the following code to test the theory:
if (message instanceof IoBuffer) {
localWrittenBytes = writeBuffer(
session, req, hasFragmentation,
maxWrittenBytes - writtenBytes,
currentTime);
* if (localWrittenBytes > 0 && ((IoBuffer)
message).hasRemaining()) {
writtenBytes += localWrittenBytes;
setInterestedInWrite(session, true);
return false;
}
*
} else if (message instanceof FileRegion) {
...and it resolved the problem! Full speed writes were back in action again
for large IoBuffers on Linux!
This seems like a change that might be good to get into 2.0-M3. If you
like, I can file an issue and attach the patch.
Kind Regards,
John Fallows.
--
>|< Kaazing Corporation >|<
John Fallows | CTO | +1.650.943.2436
800 W. El Camino Real, Ste 180 | Mountain View, CA 94040, USA