You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by jv...@apache.org on 2011/09/24 08:42:54 UTC
svn commit: r1175116 - in /mina/trunk:
core/src/main/java/org/apache/mina/transport/tcp/AbstractTcpServer.java
core/src/main/java/org/apache/mina/transport/tcp/NioSelectorProcessor.java
http/src/main/java/org/apache/mina/http/HttpServerCodec.java
Author: jvermillard
Date: Sat Sep 24 06:42:53 2011
New Revision: 1175116
URL: http://svn.apache.org/viewvc?rev=1175116&view=rev
Log:
Fixed some possible write starvation and read corruption
Modified:
mina/trunk/core/src/main/java/org/apache/mina/transport/tcp/AbstractTcpServer.java
mina/trunk/core/src/main/java/org/apache/mina/transport/tcp/NioSelectorProcessor.java
mina/trunk/http/src/main/java/org/apache/mina/http/HttpServerCodec.java
Modified: mina/trunk/core/src/main/java/org/apache/mina/transport/tcp/AbstractTcpServer.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/transport/tcp/AbstractTcpServer.java?rev=1175116&r1=1175115&r2=1175116&view=diff
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/transport/tcp/AbstractTcpServer.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/transport/tcp/AbstractTcpServer.java Sat Sep 24 06:42:53 2011
@@ -21,10 +21,8 @@ package org.apache.mina.transport.tcp;
import java.io.IOException;
import java.net.SocketAddress;
-import java.util.List;
import java.util.Set;
-import org.apache.mina.api.IoFilter;
import org.apache.mina.service.server.AbstractIoServer;
/**
@@ -57,6 +55,4 @@ public class AbstractTcpServer extends A
public void unbind(SocketAddress... localAddresses) throws IOException {
}
- private List<IoFilter> filters;
-
}
Modified: mina/trunk/core/src/main/java/org/apache/mina/transport/tcp/NioSelectorProcessor.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/transport/tcp/NioSelectorProcessor.java?rev=1175116&r1=1175115&r2=1175116&view=diff
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/transport/tcp/NioSelectorProcessor.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/transport/tcp/NioSelectorProcessor.java Sat Sep 24 06:42:53 2011
@@ -276,6 +276,7 @@ public class NioSelectorProcessor implem
LOGGER.debug("readable client {}", key);
NioTcpSession session = (NioTcpSession) key.attachment();
SocketChannel channel = session.getSocketChannel();
+ readBuffer.rewind();
int readCount = channel.read(readBuffer);
LOGGER.debug("read {} bytes", readCount);
if (readCount < 0) {
@@ -293,6 +294,7 @@ public class NioSelectorProcessor implem
if (key.isWritable()) {
LOGGER.debug("writable session : {}", key.attachment());
NioTcpSession session = (NioTcpSession) key.attachment();
+ session.setNotRegisteredForWrite();
// write from the session write queue
Queue<WriteRequest> queue = session.getWriteQueue();
do {
@@ -320,7 +322,6 @@ public class NioSelectorProcessor implem
// if the session is no more interested in writing, we need
// to stop listening for OP_WRITE events
if (queue.isEmpty()) {
- session.setNotRegisteredForWrite();
// a key registered for read ? (because we can have a
// Selector for reads and another for the writes
SelectionKey readKey = sessionReadKey.get(session);
Modified: mina/trunk/http/src/main/java/org/apache/mina/http/HttpServerCodec.java
URL: http://svn.apache.org/viewvc/mina/trunk/http/src/main/java/org/apache/mina/http/HttpServerCodec.java?rev=1175116&r1=1175115&r2=1175116&view=diff
==============================================================================
--- mina/trunk/http/src/main/java/org/apache/mina/http/HttpServerCodec.java (original)
+++ mina/trunk/http/src/main/java/org/apache/mina/http/HttpServerCodec.java Sat Sep 24 06:42:53 2011
@@ -98,8 +98,12 @@ public class HttpServerCodec implements
LOG.debug("decoding NEW");
HttpRequestImpl rq = parseHttpRequestHead(msg);
if (rq == null) {
+ // we copy the incoming BB because it's going to be recycled by the inner IoProcessor for next reads
+ ByteBuffer partial = ByteBuffer.allocate(msg.remaining());
+ partial.put(msg);
+ partial.flip();
// no request decoded, we accumulate
- session.setAttribute(PARTIAL_HEAD_ATT, msg);
+ session.setAttribute(PARTIAL_HEAD_ATT, partial);
session.setAttribute(DECODER_STATE_ATT, DecoderState.HEAD);
return;
} else {