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();
}
}
}