Author: trustin
Date: Sun Nov  4 19:01:19 2007
New Revision: 591873

URL: http://svn.apache.org/viewvc?rev=591873&view=rev
Log:
Fixed issue: DIRMINA-469 (Write throughput is horribly low.)
* Fixed as described in the issue tracker; removed the problematic if statement 
and added another sanity check code that doesn't cause the problem.

* Cleaned the EchoServer example up.


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
    
mina/trunk/example/src/main/java/org/apache/mina/example/echoserver/EchoProtocolHandler.java
    
mina/trunk/example/src/main/java/org/apache/mina/example/echoserver/Main.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=591873&r1=591872&r2=591873&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
 Sun Nov  4 19:01:19 2007
@@ -29,10 +29,11 @@
 import org.apache.mina.common.ByteBuffer;
 import org.apache.mina.common.ExceptionMonitor;
 import org.apache.mina.common.IdleStatus;
-import org.apache.mina.common.IoFilter.WriteRequest;
 import org.apache.mina.common.WriteTimeoutException;
+import org.apache.mina.common.IoFilter.WriteRequest;
 import org.apache.mina.util.NamePreservingRunnable;
 import org.apache.mina.util.Queue;
+
 import edu.emory.mathcs.backport.java.util.concurrent.Executor;
 
 /**
@@ -408,11 +409,16 @@
     }
 
     private boolean doFlush(SocketSessionImpl session) throws IOException {
+        SocketChannel ch = session.getChannel();
+        if (!ch.isConnected()) {
+            scheduleRemove(session);
+            return false;
+        }
+        
         // Clear OP_WRITE
         SelectionKey key = session.getSelectionKey();
         key.interestOps(key.interestOps() & (~SelectionKey.OP_WRITE));
 
-        SocketChannel ch = session.getChannel();
         Queue writeRequestQueue = session.getWriteRequestQueue();
 
         int writtenBytes = 0;
@@ -444,9 +450,7 @@
                     continue;
                 }
     
-                if (key.isWritable()) {
-                    writtenBytes += ch.write(buf.buf());
-                }
+                writtenBytes += ch.write(buf.buf());
     
                 if (buf.hasRemaining() || writtenBytes >= maxWrittenBytes) {
                     // Kernel buffer is full or wrote too much.

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=591873&r1=591872&r2=591873&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
 Sun Nov  4 19:01:19 2007
@@ -31,8 +31,8 @@
 import org.apache.mina.common.ByteBuffer;
 import org.apache.mina.common.ExceptionMonitor;
 import org.apache.mina.common.IdleStatus;
-import org.apache.mina.common.IoFilter.WriteRequest;
 import org.apache.mina.common.WriteTimeoutException;
+import org.apache.mina.common.IoFilter.WriteRequest;
 import org.apache.mina.util.NamePreservingRunnable;
 
 /**
@@ -364,11 +364,16 @@
     }
 
     private boolean doFlush(SocketSessionImpl session) throws IOException {
+        SocketChannel ch = session.getChannel();
+        if (!ch.isConnected()) {
+            scheduleRemove(session);
+            return false;
+        }
+        
         // Clear OP_WRITE
         SelectionKey key = session.getSelectionKey();
         key.interestOps(key.interestOps() & (~SelectionKey.OP_WRITE));
 
-        SocketChannel ch = session.getChannel();
         Queue<WriteRequest> writeRequestQueue = session.getWriteRequestQueue();
 
         int writtenBytes = 0;
@@ -394,9 +399,7 @@
                     continue;
                 }
 
-                if (key.isWritable()) {
-                    writtenBytes += ch.write(buf.buf());
-                }
+                writtenBytes += ch.write(buf.buf());
 
                 if (buf.hasRemaining() || writtenBytes >= maxWrittenBytes) {
                     // Kernel buffer is full or wrote too much.

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=591873&r1=591872&r2=591873&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 
Sun Nov  4 19:01:19 2007
@@ -421,8 +421,13 @@
     }
 
     private boolean flush(AbstractIoSession session) throws Exception {
+        if (!session.isConnected()) {
+            scheduleRemove(session);
+            return false;
+        }
+
         // Clear OP_WRITE
-        setOpWrite(session,false);
+        setOpWrite(session, false);
 
         Queue<WriteRequest> writeRequestQueue = session.getWriteRequestQueue();
 
@@ -450,11 +455,9 @@
                     continue;
                 }
 
-                if (isWritable(session)) {
-                    long localWrittenBytes = transferFile(session, region);
-                    region.setPosition(region.getPosition() + 
localWrittenBytes);
-                    writtenBytes += localWrittenBytes;
-                }
+                long 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.
@@ -472,9 +475,7 @@
                     continue;
                 }
 
-                if (isWritable(session)) {
-                    writtenBytes += write(session, buf);
-                }
+                writtenBytes += write(session, buf);
 
                 if (buf.hasRemaining() || writtenBytes >= maxWrittenBytes) {
                     // Kernel buffer is full or wrote too much.

Modified: 
mina/trunk/example/src/main/java/org/apache/mina/example/echoserver/EchoProtocolHandler.java
URL: 
http://svn.apache.org/viewvc/mina/trunk/example/src/main/java/org/apache/mina/example/echoserver/EchoProtocolHandler.java?rev=591873&r1=591872&r2=591873&view=diff
==============================================================================
--- 
mina/trunk/example/src/main/java/org/apache/mina/example/echoserver/EchoProtocolHandler.java
 (original)
+++ 
mina/trunk/example/src/main/java/org/apache/mina/example/echoserver/EchoProtocolHandler.java
 Sun Nov  4 19:01:19 2007
@@ -25,10 +25,7 @@
 import org.apache.mina.common.IoHandlerAdapter;
 import org.apache.mina.common.IoSession;
 import org.apache.mina.common.IoSessionLogger;
-import org.apache.mina.common.WriteException;
 import org.apache.mina.filter.ssl.SslFilter;
-import org.apache.mina.transport.socket.SocketSession;
-import org.apache.mina.transport.socket.SocketSessionConfig;
 
 /**
  * [EMAIL PROTECTED] IoHandler} implementation for echo server.
@@ -39,11 +36,6 @@
 public class EchoProtocolHandler extends IoHandlerAdapter {
     @Override
     public void sessionCreated(IoSession session) {
-        if (session instanceof SocketSession) {
-            SocketSessionConfig config = ((SocketSession) session).getConfig();
-            config.setReceiveBufferSize(2048);
-        }
-
         session.getConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);
 
         // We're going to use SSL negotiation notification.
@@ -58,26 +50,13 @@
 
     @Override
     public void exceptionCaught(IoSession session, Throwable cause) {
-        IoSessionLogger.getLogger(session).warn(cause);
-        if (cause instanceof WriteException) {
-            WriteException e = (WriteException) cause;
-            IoSessionLogger.getLogger(session).warn("Failed write requests: 
{}", e.getRequests());
-        }
         session.close();
     }
 
     @Override
     public void messageReceived(IoSession session, Object message)
             throws Exception {
-        if (!(message instanceof IoBuffer)) {
-            return;
-        }
-
-        IoBuffer rb = (IoBuffer) message;
         // Write the received data back to remote peer
-        IoBuffer wb = IoBuffer.allocate(rb.remaining());
-        wb.put(rb);
-        wb.flip();
-        session.write(wb);
+        session.write(((IoBuffer) message).duplicate());
     }
 }

Modified: 
mina/trunk/example/src/main/java/org/apache/mina/example/echoserver/Main.java
URL: 
http://svn.apache.org/viewvc/mina/trunk/example/src/main/java/org/apache/mina/example/echoserver/Main.java?rev=591873&r1=591872&r2=591873&view=diff
==============================================================================
--- 
mina/trunk/example/src/main/java/org/apache/mina/example/echoserver/Main.java 
(original)
+++ 
mina/trunk/example/src/main/java/org/apache/mina/example/echoserver/Main.java 
Sun Nov  4 19:01:19 2007
@@ -20,12 +20,13 @@
 package org.apache.mina.example.echoserver;
 
 import java.net.InetSocketAddress;
+import java.util.concurrent.Executors;
 
 import org.apache.mina.common.DefaultIoFilterChainBuilder;
-import org.apache.mina.common.IoAcceptor;
 import org.apache.mina.example.echoserver.ssl.BogusSslContextFactory;
 import org.apache.mina.filter.logging.LoggingFilter;
 import org.apache.mina.filter.ssl.SslFilter;
+import org.apache.mina.transport.socket.SocketAcceptor;
 import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
 
 /**
@@ -42,7 +43,7 @@
     private static final boolean USE_SSL = false;
 
     public static void main(String[] args) throws Exception {
-        IoAcceptor acceptor = new NioSocketAcceptor();
+        SocketAcceptor acceptor = new 
NioSocketAcceptor(Executors.newCachedThreadPool());
         DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
 
         // Add SSL filter if SSL is enabled.
@@ -51,7 +52,7 @@
         }
 
         addLogger(chain);
-
+        
         // Bind
         acceptor.setLocalAddress(new InetSocketAddress(PORT));
         acceptor.setHandler(new EchoProtocolHandler());


Reply via email to