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 {