You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by jb...@apache.org on 2011/06/04 01:41:52 UTC

svn commit: r1131291 - in /cassandra/branches/cassandra-0.6: CHANGES.txt src/java/org/apache/cassandra/net/IncomingTcpConnection.java

Author: jbellis
Date: Fri Jun  3 23:41:52 2011
New Revision: 1131291

URL: http://svn.apache.org/viewvc?rev=1131291&view=rev
Log:
work around nio socket memory retention bug
patch by Hannes Schmidt and jbellis; tested by Thibaut, reviewed by slebresne for CASSANDRA-2654

Modified:
    cassandra/branches/cassandra-0.6/CHANGES.txt
    cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/net/IncomingTcpConnection.java

Modified: cassandra/branches/cassandra-0.6/CHANGES.txt
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.6/CHANGES.txt?rev=1131291&r1=1131290&r2=1131291&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.6/CHANGES.txt (original)
+++ cassandra/branches/cassandra-0.6/CHANGES.txt Fri Jun  3 23:41:52 2011
@@ -1,3 +1,8 @@
+0.6.14?
+ * workaround large resultsets causing large allocation retention
+   by nio sockets (CASSANDRA-2654)
+
+
 0.6.13
  * shut down server for OOM on a Thrift thread (CASSANDRA-2269)
  * fix reversed slices on large supercolumn rows (CASSANDRA-2212)

Modified: cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/net/IncomingTcpConnection.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/net/IncomingTcpConnection.java?rev=1131291&r1=1131290&r2=1131291&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/net/IncomingTcpConnection.java (original)
+++ cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/net/IncomingTcpConnection.java Fri Jun  3 23:41:52 2011
@@ -32,6 +32,8 @@ public class IncomingTcpConnection exten
 {
     private static Logger logger = Logger.getLogger(IncomingTcpConnection.class);
 
+    private static final int CHUNK_SIZE = 1024 * 1024;
+    
     private Socket socket;
 
     public IncomingTcpConnection(Socket socket)
@@ -79,8 +81,13 @@ public class IncomingTcpConnection exten
                 {
                     int size = input.readInt();
                     byte[] contentBytes = new byte[size];
-                    input.readFully(contentBytes);
-                    
+                    // readFully allocates a direct buffer the size of the chunk it is asked to read,
+                    // so we cap that at CHUNK_SIZE.  See https://issues.apache.org/jira/browse/CASSANDRA-2654
+                    int remainder = size % CHUNK_SIZE;
+                    for (int offset = 0; offset < size - remainder; offset += CHUNK_SIZE)
+                        input.readFully(contentBytes, offset, CHUNK_SIZE);
+                    input.readFully(contentBytes, size - remainder, remainder);
+
                     Message message = Message.serializer().deserialize(new DataInputStream(new ByteArrayInputStream(contentBytes)));
                     MessagingService.receive(message);
                 }