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());