You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by sl...@apache.org on 2013/12/03 14:54:21 UTC

git commit: Warn when a read collection has > 64k elements

Updated Branches:
  refs/heads/cassandra-1.2 ecd94221a -> f634ac7ea


Warn when a read collection has > 64k elements

patch by slebresne; reviewed by iamaleksey for CASSANDRA-5428


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/f634ac7e
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/f634ac7e
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/f634ac7e

Branch: refs/heads/cassandra-1.2
Commit: f634ac7eae468b944d22951fc7c9d05aa6c7f447
Parents: ecd9422
Author: Sylvain Lebresne <sy...@datastax.com>
Authored: Tue Dec 3 14:53:33 2013 +0100
Committer: Sylvain Lebresne <sy...@datastax.com>
Committed: Tue Dec 3 14:53:33 2013 +0100

----------------------------------------------------------------------
 CHANGES.txt                                        |  1 +
 .../cassandra/db/marshal/CollectionType.java       | 17 +++++++++++++++++
 .../org/apache/cassandra/db/marshal/ListType.java  |  2 ++
 .../org/apache/cassandra/db/marshal/MapType.java   |  2 ++
 .../org/apache/cassandra/db/marshal/SetType.java   |  2 ++
 5 files changed, 24 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/f634ac7e/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index c80a00a..8e6cffa 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -8,6 +8,7 @@
  * Throw IRE if a prepared has more markers than supported (CASSANDRA-5598)
  * Expose Thread metrics for the native protocol server (CASSANDRA-6234)
  * Change snapshot response message verb (CASSANDRA-6415)
+ * Warn when collection read has > 65K elements (CASSANDRA-5428)
 
 
 1.2.12

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f634ac7e/src/java/org/apache/cassandra/db/marshal/CollectionType.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/marshal/CollectionType.java b/src/java/org/apache/cassandra/db/marshal/CollectionType.java
index ad2ea67..a34a2b7 100644
--- a/src/java/org/apache/cassandra/db/marshal/CollectionType.java
+++ b/src/java/org/apache/cassandra/db/marshal/CollectionType.java
@@ -20,6 +20,9 @@ package org.apache.cassandra.db.marshal;
 import java.nio.ByteBuffer;
 import java.util.List;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import org.apache.cassandra.cql3.CQL3Type;
 import org.apache.cassandra.db.IColumn;
 import org.apache.cassandra.utils.ByteBufferUtil;
@@ -33,6 +36,10 @@ import org.apache.cassandra.utils.Pair;
  */
 public abstract class CollectionType<T> extends AbstractType<T>
 {
+    private static final Logger logger = LoggerFactory.getLogger(CollectionType.class);
+
+    public static final int MAX_ELEMENTS = 65535;
+
     public enum Kind
     {
         MAP, SET, LIST
@@ -105,6 +112,16 @@ public abstract class CollectionType<T> extends AbstractType<T>
         return (ByteBuffer)result.flip();
     }
 
+    protected List<Pair<ByteBuffer, IColumn>> enforceLimit(List<Pair<ByteBuffer, IColumn>> columns)
+    {
+        if (columns.size() <= MAX_ELEMENTS)
+            return columns;
+
+        logger.error("Detected collection with {} elements, more than the {} limit. Only the first {} elements will be returned to the client. "
+                   + "Please see http://cassandra.apache.org/doc/cql3/CQL.html#collections for more details.", columns.size(), MAX_ELEMENTS, MAX_ELEMENTS);
+        return columns.subList(0, MAX_ELEMENTS);
+    }
+
     public static ByteBuffer pack(List<ByteBuffer> buffers, int elements)
     {
         int size = 0;

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f634ac7e/src/java/org/apache/cassandra/db/marshal/ListType.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/marshal/ListType.java b/src/java/org/apache/cassandra/db/marshal/ListType.java
index b6613ae..b219af1 100644
--- a/src/java/org/apache/cassandra/db/marshal/ListType.java
+++ b/src/java/org/apache/cassandra/db/marshal/ListType.java
@@ -120,6 +120,8 @@ public class ListType<T> extends CollectionType<List<T>>
 
     public ByteBuffer serialize(List<Pair<ByteBuffer, IColumn>> columns)
     {
+        columns = enforceLimit(columns);
+
         List<ByteBuffer> bbs = new ArrayList<ByteBuffer>(columns.size());
         int size = 0;
         for (Pair<ByteBuffer, IColumn> p : columns)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f634ac7e/src/java/org/apache/cassandra/db/marshal/MapType.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/marshal/MapType.java b/src/java/org/apache/cassandra/db/marshal/MapType.java
index 19310df..750851e 100644
--- a/src/java/org/apache/cassandra/db/marshal/MapType.java
+++ b/src/java/org/apache/cassandra/db/marshal/MapType.java
@@ -137,6 +137,8 @@ public class MapType<K, V> extends CollectionType<Map<K, V>>
      */
     public ByteBuffer serialize(List<Pair<ByteBuffer, IColumn>> columns)
     {
+        columns = enforceLimit(columns);
+
         List<ByteBuffer> bbs = new ArrayList<ByteBuffer>(2 * columns.size());
         int size = 0;
         for (Pair<ByteBuffer, IColumn> p : columns)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f634ac7e/src/java/org/apache/cassandra/db/marshal/SetType.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/marshal/SetType.java b/src/java/org/apache/cassandra/db/marshal/SetType.java
index 73f25e0..a1ba74d 100644
--- a/src/java/org/apache/cassandra/db/marshal/SetType.java
+++ b/src/java/org/apache/cassandra/db/marshal/SetType.java
@@ -120,6 +120,8 @@ public class SetType<T> extends CollectionType<Set<T>>
 
     public ByteBuffer serialize(List<Pair<ByteBuffer, IColumn>> columns)
     {
+        columns = enforceLimit(columns);
+
         List<ByteBuffer> bbs = new ArrayList<ByteBuffer>(columns.size());
         int size = 0;
         for (Pair<ByteBuffer, IColumn> p : columns)