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/07/15 10:33:45 UTC
git commit: Fix potential index out of bound error in
RangeTombstoneList (+test)
Updated Branches:
refs/heads/cassandra-1.2 fa327aa69 -> f5b224cf9
Fix potential index out of bound error in RangeTombstoneList (+test)
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/f5b224cf
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/f5b224cf
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/f5b224cf
Branch: refs/heads/cassandra-1.2
Commit: f5b224cf9aa0f319d51078ef4b78d55e36613963
Parents: fa327aa
Author: Sylvain Lebresne <sy...@datastax.com>
Authored: Mon Jul 15 10:33:34 2013 +0200
Committer: Sylvain Lebresne <sy...@datastax.com>
Committed: Mon Jul 15 10:33:34 2013 +0200
----------------------------------------------------------------------
.../apache/cassandra/db/RangeTombstoneList.java | 13 +++----
.../cassandra/db/RangeTombstoneListTest.java | 37 ++++++++++++++++++++
2 files changed, 44 insertions(+), 6 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/f5b224cf/src/java/org/apache/cassandra/db/RangeTombstoneList.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/RangeTombstoneList.java b/src/java/org/apache/cassandra/db/RangeTombstoneList.java
index 0a761cd..e7ec119 100644
--- a/src/java/org/apache/cassandra/db/RangeTombstoneList.java
+++ b/src/java/org/apache/cassandra/db/RangeTombstoneList.java
@@ -201,8 +201,9 @@ public class RangeTombstoneList implements Iterable<RangeTombstone>
i++;
}
}
+ // Addds the remaining ones from tombstones if any (not that insertFrom will increment size if relevant).
for (; j < tombstones.size; j++)
- insertFrom((i++) - 1, tombstones.starts[j], tombstones.ends[j], tombstones.markedAts[j], tombstones.delTimes[j]);
+ insertFrom(size - 1, tombstones.starts[j], tombstones.ends[j], tombstones.markedAts[j], tombstones.delTimes[j]);
}
}
@@ -374,7 +375,7 @@ public class RangeTombstoneList implements Iterable<RangeTombstone>
/*
* Inserts a new element whose start should be inserted at index i. This method
* assumes that:
- * - starts[i] <= start.
+ * - starts[i] <= start
* - start < starts[i+1] or there is no i+1 element.
*/
private void insertFrom(int i, ByteBuffer start, ByteBuffer end, long markedAt, int delTime)
@@ -388,12 +389,12 @@ public class RangeTombstoneList implements Iterable<RangeTombstone>
/*
* We have elt(i) = [s_i, e_i]@t_i and want to insert X = [s, e]@t, knowing that s_i < s < s_i+1.
* We can have 3 cases:
- * - s <= e_i && e <= e_i: we're fully contained in i.
- * - s <= e_i && e > e_i: we rewrite X to X1=[s, e_i]@t + X2=[e_i, e]@t. X1 is fully contained
+ * - s < e_i && e <= e_i: we're fully contained in i.
+ * - s < e_i && e > e_i: we rewrite X to X1=[s, e_i]@t + X2=[e_i, e]@t. X1 is fully contained
* in i and X2 is the insertAfter() case for i.
- * - s > e_i: we're in the insertAfter() case for i.
+ * - s >= e_i: we're in the insertAfter() case for i.
*/
- if (comparator.compare(start, ends[i]) <= 0)
+ if (comparator.compare(start, ends[i]) < 0)
{
if (comparator.compare(end, ends[i]) <= 0)
{
http://git-wip-us.apache.org/repos/asf/cassandra/blob/f5b224cf/test/unit/org/apache/cassandra/db/RangeTombstoneListTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/db/RangeTombstoneListTest.java b/test/unit/org/apache/cassandra/db/RangeTombstoneListTest.java
index 39f9e6c..67e3623 100644
--- a/test/unit/org/apache/cassandra/db/RangeTombstoneListTest.java
+++ b/test/unit/org/apache/cassandra/db/RangeTombstoneListTest.java
@@ -205,6 +205,43 @@ public class RangeTombstoneListTest
}
@Test
+ public void addAllSequentialTest()
+ {
+ RangeTombstoneList l1 = new RangeTombstoneList(cmp, 0);
+ l1.add(rt(3, 5, 2));
+
+ RangeTombstoneList l2 = new RangeTombstoneList(cmp, 0);
+ l2.add(rt(5, 7, 7));
+
+ l1.addAll(l2);
+
+ Iterator<RangeTombstone> iter = l1.iterator();
+ assertRT(rt(3, 5, 2), iter.next());
+ assertRT(rt(5, 7, 7), iter.next());
+
+ assert !iter.hasNext();
+ }
+
+ @Test
+ public void addAllIncludedTest()
+ {
+ RangeTombstoneList l1 = new RangeTombstoneList(cmp, 0);
+ l1.add(rt(3, 10, 5));
+
+ RangeTombstoneList l2 = new RangeTombstoneList(cmp, 0);
+ l2.add(rt(4, 5, 2));
+ l2.add(rt(5, 7, 3));
+ l2.add(rt(7, 9, 4));
+
+ l1.addAll(l2);
+
+ Iterator<RangeTombstone> iter = l1.iterator();
+ assertRT(rt(3, 10, 5), iter.next());
+
+ assert !iter.hasNext();
+ }
+
+ @Test
public void purgetTest()
{
RangeTombstoneList l = new RangeTombstoneList(cmp, 0);