You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by ty...@apache.org on 2014/12/12 18:41:45 UTC

cassandra git commit: Avoid stack overflow on large clustering IN values

Repository: cassandra
Updated Branches:
  refs/heads/cassandra-2.0 3f3d0edba -> 9dc9185f5


Avoid stack overflow on large clustering IN values

Patch by Tyler Hobbs; reviewed by Benjamin Lerer for CASSANDRA-8410


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

Branch: refs/heads/cassandra-2.0
Commit: 9dc9185f5c7172915485f713dbbb6b78b22d0f66
Parents: 3f3d0ed
Author: Tyler Hobbs <ty...@datastax.com>
Authored: Fri Dec 12 11:41:06 2014 -0600
Committer: Tyler Hobbs <ty...@datastax.com>
Committed: Fri Dec 12 11:41:06 2014 -0600

----------------------------------------------------------------------
 CHANGES.txt                                     |  2 +
 .../apache/cassandra/db/filter/ColumnSlice.java | 48 ++++++++++----------
 2 files changed, 26 insertions(+), 24 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/9dc9185f/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index cc426bb..6cecf99 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,6 @@
 2.0.12:
+ * Avoid StackOverflowError when a large list of IN values
+   is used for a clustering column (CASSANDRA-8410)
  * Fix NPE when writetime() or ttl() calls are wrapped by
    another function call (CASSANDRA-8451)
  * Fix NPE after dropping a keyspace (CASSANDRA-8332)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/9dc9185f/src/java/org/apache/cassandra/db/filter/ColumnSlice.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/filter/ColumnSlice.java b/src/java/org/apache/cassandra/db/filter/ColumnSlice.java
index 9eff12a..6a9efbb 100644
--- a/src/java/org/apache/cassandra/db/filter/ColumnSlice.java
+++ b/src/java/org/apache/cassandra/db/filter/ColumnSlice.java
@@ -130,36 +130,36 @@ public class ColumnSlice
 
         protected Column computeNext()
         {
-            if (currentSlice == null)
+            while (currentSlice != null || idx < slices.length)
             {
-                if (idx >= slices.length)
-                    return endOfData();
-
-                ColumnSlice slice = slices[idx++];
-                // Note: we specialize the case of start == "" and finish = "" because it is slightly more efficient, but also they have a specific
-                // meaning (namely, they always extend to the beginning/end of the range).
-                if (slice.start.remaining() == 0)
+                if (currentSlice == null)
                 {
-                    if (slice.finish.remaining() == 0)
-                        currentSlice = map.values().iterator();
+                    ColumnSlice slice = slices[idx++];
+                    // Note: we specialize the case of start == "" and finish = "" because it is slightly more efficient, but also they have a specific
+                    // meaning (namely, they always extend to the beginning/end of the range).
+                    if (slice.start.remaining() == 0)
+                    {
+                        if (slice.finish.remaining() == 0)
+                            currentSlice = map.values().iterator();
+                        else
+                            currentSlice = map.headMap(slice.finish, true).values().iterator();
+                    }
+                    else if (slice.finish.remaining() == 0)
+                    {
+                        currentSlice = map.tailMap(slice.start, true).values().iterator();
+                    }
                     else
-                        currentSlice = map.headMap(slice.finish, true).values().iterator();
-                }
-                else if (slice.finish.remaining() == 0)
-                {
-                    currentSlice = map.tailMap(slice.start, true).values().iterator();
+                    {
+                        currentSlice = map.subMap(slice.start, true, slice.finish, true).values().iterator();
+                    }
                 }
-                else
-                {
-                    currentSlice = map.subMap(slice.start, true, slice.finish, true).values().iterator();
-                }
-            }
 
-            if (currentSlice.hasNext())
-                return currentSlice.next();
+                if (currentSlice.hasNext())
+                    return currentSlice.next();
 
-            currentSlice = null;
-            return computeNext();
+                currentSlice = null;
+            }
+            return endOfData();
         }
     }
 }