Author: trustin
Date: Mon Nov  5 00:33:26 2007
New Revision: 591910

URL: http://svn.apache.org/viewvc?rev=591910&view=rev
Log:
Related issue: DIRMINA-469 (Write throughput is horribly low)
* Improved the write operation loop more efficiently.
* Adjust the default write limit of AbstractIoProcessor to squeeze throughput.


Modified:
    
mina/branches/1.0/core/src/main/java/org/apache/mina/transport/socket/nio/SocketIoProcessor.java
    
mina/branches/1.1/core/src/main/java/org/apache/mina/transport/socket/nio/SocketIoProcessor.java
    
mina/trunk/core/src/main/java/org/apache/mina/common/AbstractIoProcessor.java

Modified: 
mina/branches/1.0/core/src/main/java/org/apache/mina/transport/socket/nio/SocketIoProcessor.java
URL: 
http://svn.apache.org/viewvc/mina/branches/1.0/core/src/main/java/org/apache/mina/transport/socket/nio/SocketIoProcessor.java?rev=591910&r1=591909&r2=591910&view=diff
==============================================================================
--- 
mina/branches/1.0/core/src/main/java/org/apache/mina/transport/socket/nio/SocketIoProcessor.java
 (original)
+++ 
mina/branches/1.0/core/src/main/java/org/apache/mina/transport/socket/nio/SocketIoProcessor.java
 Mon Nov  5 00:33:26 2007
@@ -450,9 +450,10 @@
                     continue;
                 }
     
-                writtenBytes += ch.write(buf.buf());
-    
-                if (buf.hasRemaining() || writtenBytes >= maxWrittenBytes) {
+                int localWrittenBytes = ch.write(buf.buf());
+                writtenBytes += localWrittenBytes;
+
+                if (localWrittenBytes == 0 || writtenBytes >= maxWrittenBytes) 
{
                     // Kernel buffer is full or wrote too much.
                     key.interestOps(key.interestOps() | SelectionKey.OP_WRITE);
                     return false;

Modified: 
mina/branches/1.1/core/src/main/java/org/apache/mina/transport/socket/nio/SocketIoProcessor.java
URL: 
http://svn.apache.org/viewvc/mina/branches/1.1/core/src/main/java/org/apache/mina/transport/socket/nio/SocketIoProcessor.java?rev=591910&r1=591909&r2=591910&view=diff
==============================================================================
--- 
mina/branches/1.1/core/src/main/java/org/apache/mina/transport/socket/nio/SocketIoProcessor.java
 (original)
+++ 
mina/branches/1.1/core/src/main/java/org/apache/mina/transport/socket/nio/SocketIoProcessor.java
 Mon Nov  5 00:33:26 2007
@@ -399,9 +399,10 @@
                     continue;
                 }
 
-                writtenBytes += ch.write(buf.buf());
+                int localWrittenBytes = ch.write(buf.buf());
+                writtenBytes += localWrittenBytes;
 
-                if (buf.hasRemaining() || writtenBytes >= maxWrittenBytes) {
+                if (localWrittenBytes == 0 || writtenBytes >= maxWrittenBytes) 
{
                     // Kernel buffer is full or wrote too much.
                     key.interestOps(key.interestOps() | SelectionKey.OP_WRITE);
                     return false;

Modified: 
mina/trunk/core/src/main/java/org/apache/mina/common/AbstractIoProcessor.java
URL: 
http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/common/AbstractIoProcessor.java?rev=591910&r1=591909&r2=591910&view=diff
==============================================================================
--- 
mina/trunk/core/src/main/java/org/apache/mina/common/AbstractIoProcessor.java 
(original)
+++ 
mina/trunk/core/src/main/java/org/apache/mina/common/AbstractIoProcessor.java 
Mon Nov  5 00:33:26 2007
@@ -433,8 +433,9 @@
         Queue<WriteRequest> writeRequestQueue = session.getWriteRequestQueue();
 
         // Set limitation for the number of written bytes for read-write
-        // fairness.
-        int maxWrittenBytes = session.getConfig().getMaxReadBufferSize();
+        // fairness.  I doubled the maxReadBufferSize which yields best
+        // performance in my experience, while not breaking fairness much.
+        int maxWrittenBytes = session.getConfig().getMaxReadBufferSize() << 1;
         int writtenBytes = 0;
 
         do {
@@ -445,6 +446,7 @@
                 break;
             }
 
+            long localWrittenBytes;
             Object message = req.getMessage();
             if (message instanceof FileRegion) {
                 FileRegion region = (FileRegion) message;
@@ -456,16 +458,8 @@
                     continue;
                 }
 
-                long localWrittenBytes = transferFile(session, region);
+                localWrittenBytes = transferFile(session, region);
                 region.setPosition(region.getPosition() + localWrittenBytes);
-                writtenBytes += localWrittenBytes;
-
-                if (region.getCount() > 0 || writtenBytes >= maxWrittenBytes) {
-                    // Kernel buffer is full or wrote too much.
-                    setOpWrite(session, true);
-                    return false;
-                }
-
             } else {
                 IoBuffer buf = (IoBuffer) message;
                 if (buf.remaining() == 0) {
@@ -476,13 +470,15 @@
                     continue;
                 }
 
-                writtenBytes += write(session, buf);
+                localWrittenBytes = write(session, buf);
+            }
+            
+            writtenBytes += localWrittenBytes;
 
-                if (buf.hasRemaining() || writtenBytes >= maxWrittenBytes) {
-                    // Kernel buffer is full or wrote too much.
-                    setOpWrite(session, true);
-                    return false;
-                }
+            if (localWrittenBytes == 0 || writtenBytes >= maxWrittenBytes) {
+                // Kernel buffer is full or wrote too much.
+                setOpWrite(session, true);
+                return false;
             }
         } while (writtenBytes < maxWrittenBytes);
 


Reply via email to