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 2015/05/29 11:11:11 UTC

[1/3] cassandra git commit: Fix condition in RangeTombstoneList.add that breaks test

Repository: cassandra
Updated Branches:
  refs/heads/cassandra-2.2 180130a8e -> 302eb46c8


Fix condition in RangeTombstoneList.add that breaks test

patch by aweisberg; reviewed by slebresne for CASSANDRA-9485


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

Branch: refs/heads/cassandra-2.2
Commit: 173f2552d10b5d081888f62864c40380622097e7
Parents: 04eba90
Author: Ariel Weisberg <ar...@datastax.com>
Authored: Fri May 29 10:50:15 2015 +0200
Committer: Sylvain Lebresne <sy...@datastax.com>
Committed: Fri May 29 10:54:40 2015 +0200

----------------------------------------------------------------------
 CHANGES.txt                                     |  1 +
 .../apache/cassandra/db/RangeTombstoneList.java |  4 +--
 .../cassandra/db/RangeTombstoneListTest.java    | 28 ++++++++++++++++----
 3 files changed, 26 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/173f2552/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 58f3c53..b9a0131 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 2.0.16:
+ * Fix bad condition in RangeTombstoneList (CASSANDRA-9485)
  * Fix potential StackOverflow when setting CrcCheckChance over JMX (CASSANDRA-9488)
  * Fix null static columns in pages after the first, paged reversed
    queries (CASSANDRA-8502)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/173f2552/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 b49c2fc..165718e 100644
--- a/src/java/org/apache/cassandra/db/RangeTombstoneList.java
+++ b/src/java/org/apache/cassandra/db/RangeTombstoneList.java
@@ -116,7 +116,7 @@ public class RangeTombstoneList implements Iterable<RangeTombstone>
     /**
      * Adds a new range tombstone.
      *
-     * This method will be faster if the new tombstone sort after all the currently existing ones (this is a common use case), 
+     * This method will be faster if the new tombstone sort after all the currently existing ones (this is a common use case),
      * but it doesn't assume it.
      */
     public void add(ByteBuffer start, ByteBuffer end, long markedAt, int delTime)
@@ -130,7 +130,7 @@ public class RangeTombstoneList implements Iterable<RangeTombstone>
         int c = comparator.compare(ends[size-1], start);
 
         // Fast path if we add in sorted order
-        if (c <= 0)
+        if (c < 0)
         {
             addInternal(size, start, end, markedAt, delTime);
         }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/173f2552/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 b0065e0..2a7c90f 100644
--- a/test/unit/org/apache/cassandra/db/RangeTombstoneListTest.java
+++ b/test/unit/org/apache/cassandra/db/RangeTombstoneListTest.java
@@ -30,7 +30,6 @@ import org.apache.cassandra.utils.ByteBufferUtil;
 public class RangeTombstoneListTest
 {
     private static final Comparator<ByteBuffer> cmp = IntegerType.instance;
-    private static final Random rand = new Random();
 
     @Test
     public void sortedAdditionTest()
@@ -296,7 +295,23 @@ public class RangeTombstoneListTest
         assertEquals(6, l.maxMarkedAt());
     }
 
-    private RangeTombstoneList makeRandom(int size, int maxItSize, int maxItDistance, int maxMarkedAt)
+    @Test
+    public void insertSameTest()
+    {
+        // Simple test that adding the same element multiple time ends up
+        // with that element only a single time (CASSANDRA-9485)
+
+        RangeTombstoneList l = new RangeTombstoneList(cmp, 0);
+        l.add(rt(4, 4, 5, 100));
+        l.add(rt(4, 4, 6, 110));
+        l.add(rt(4, 4, 4, 90));
+
+        Iterator<RangeTombstone> iter = l.iterator();
+        assertRT(rt(4, 4, 6, 110), iter.next());
+        assert !iter.hasNext();
+    }
+
+    private RangeTombstoneList makeRandom(Random rand, int size, int maxItSize, int maxItDistance, int maxMarkedAt)
     {
         RangeTombstoneList l = new RangeTombstoneList(cmp, size);
 
@@ -329,10 +344,13 @@ public class RangeTombstoneListTest
         int MAX_IT_DISTANCE = 10;
         int MAX_MARKEDAT = 10;
 
+        long seed = System.nanoTime();
+        Random rand = new Random(seed);
+
         for (int i = 0; i < TEST_COUNT; i++)
         {
-            RangeTombstoneList l1 = makeRandom(rand.nextInt(MAX_LIST_SIZE) + 1, rand.nextInt(MAX_IT_SIZE) + 1, rand.nextInt(MAX_IT_DISTANCE) + 1, rand.nextInt(MAX_MARKEDAT) + 1);
-            RangeTombstoneList l2 = makeRandom(rand.nextInt(MAX_LIST_SIZE) + 1, rand.nextInt(MAX_IT_SIZE) + 1, rand.nextInt(MAX_IT_DISTANCE) + 1, rand.nextInt(MAX_MARKEDAT) + 1);
+            RangeTombstoneList l1 = makeRandom(rand, rand.nextInt(MAX_LIST_SIZE) + 1, rand.nextInt(MAX_IT_SIZE) + 1, rand.nextInt(MAX_IT_DISTANCE) + 1, rand.nextInt(MAX_MARKEDAT) + 1);
+            RangeTombstoneList l2 = makeRandom(rand, rand.nextInt(MAX_LIST_SIZE) + 1, rand.nextInt(MAX_IT_SIZE) + 1, rand.nextInt(MAX_IT_DISTANCE) + 1, rand.nextInt(MAX_MARKEDAT) + 1);
 
             RangeTombstoneList l1Initial = l1.copy();
 
@@ -346,7 +364,7 @@ public class RangeTombstoneListTest
             {
                 System.out.println("Error merging:");
                 System.out.println(" l1: " + toString(l1Initial));
-                System.out.println(" l2: " + toString(l2));
+                System.out.println("Seed was: " + seed);
                 throw e;
             }
         }


[3/3] cassandra git commit: Merge branch 'cassandra-2.1' into cassandra-2.2

Posted by sl...@apache.org.
Merge branch 'cassandra-2.1' into cassandra-2.2


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

Branch: refs/heads/cassandra-2.2
Commit: 302eb46c8cd165fbacb950fd99760470b9f8f751
Parents: 180130a e1a67a4
Author: Sylvain Lebresne <sy...@datastax.com>
Authored: Fri May 29 11:05:53 2015 +0200
Committer: Sylvain Lebresne <sy...@datastax.com>
Committed: Fri May 29 11:05:53 2015 +0200

----------------------------------------------------------------------
 CHANGES.txt                                     |  1 +
 .../apache/cassandra/db/RangeTombstoneList.java |  4 +--
 .../cassandra/db/RangeTombstoneListTest.java    | 27 +++++++++++++++++---
 3 files changed, 26 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/302eb46c/CHANGES.txt
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cassandra/blob/302eb46c/src/java/org/apache/cassandra/db/RangeTombstoneList.java
----------------------------------------------------------------------


[2/3] cassandra git commit: Merge branch 'cassandra-2.0' into cassandra-2.1

Posted by sl...@apache.org.
Merge branch 'cassandra-2.0' into cassandra-2.1

Conflicts:
	CHANGES.txt
	test/unit/org/apache/cassandra/db/RangeTombstoneListTest.java


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

Branch: refs/heads/cassandra-2.2
Commit: e1a67a4f5361b7f069110c2c9779705ca99db28a
Parents: eaeabff 173f255
Author: Sylvain Lebresne <sy...@datastax.com>
Authored: Fri May 29 11:05:02 2015 +0200
Committer: Sylvain Lebresne <sy...@datastax.com>
Committed: Fri May 29 11:05:02 2015 +0200

----------------------------------------------------------------------
 CHANGES.txt                                     |  1 +
 .../apache/cassandra/db/RangeTombstoneList.java |  4 +--
 .../cassandra/db/RangeTombstoneListTest.java    | 27 +++++++++++++++++---
 3 files changed, 26 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/e1a67a4f/CHANGES.txt
----------------------------------------------------------------------
diff --cc CHANGES.txt
index 0e759b7,b9a0131..422f66e
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@@ -1,35 -1,5 +1,36 @@@
 -2.0.16:
 +2.1.6
 + * Avoid getting unreadable keys during anticompaction (CASSANDRA-9508)
 + * (cqlsh) Better float precision by default (CASSANDRA-9224)
 + * Improve estimated row count (CASSANDRA-9107)
 + * Optimize range tombstone memory footprint (CASSANDRA-8603)
 + * Use configured gcgs in anticompaction (CASSANDRA-9397)
 + * Warn on misuse of unlogged batches (CASSANDRA-9282)
 + * Failure detector detects and ignores local pauses (CASSANDRA-9183)
 + * Add utility class to support for rate limiting a given log statement (CASSANDRA-9029)
 + * Add missing consistency levels to cassandra-stess (CASSANDRA-9361)
 + * Fix commitlog getCompletedTasks to not increment (CASSANDRA-9339)
 + * Fix for harmless exceptions logged as ERROR (CASSANDRA-8564)
 + * Delete processed sstables in sstablesplit/sstableupgrade (CASSANDRA-8606)
 + * Improve sstable exclusion from partition tombstones (CASSANDRA-9298)
 + * Validate the indexed column rather than the cell's contents for 2i (CASSANDRA-9057)
 + * Add support for top-k custom 2i queries (CASSANDRA-8717)
 + * Fix error when dropping table during compaction (CASSANDRA-9251)
 + * cassandra-stress supports validation operations over user profiles (CASSANDRA-8773)
 + * Add support for rate limiting log messages (CASSANDRA-9029)
 + * Log the partition key with tombstone warnings (CASSANDRA-8561)
 + * Reduce runWithCompactionsDisabled poll interval to 1ms (CASSANDRA-9271)
 + * Fix PITR commitlog replay (CASSANDRA-9195)
 + * GCInspector logs very different times (CASSANDRA-9124)
 + * Fix deleting from an empty list (CASSANDRA-9198)
 + * Update tuple and collection types that use a user-defined type when that UDT
 +   is modified (CASSANDRA-9148, CASSANDRA-9192)
 + * Use higher timeout for prepair and snapshot in repair (CASSANDRA-9261)
 + * Fix anticompaction blocking ANTI_ENTROPY stage (CASSANDRA-9151)
 + * Repair waits for anticompaction to finish (CASSANDRA-9097)
 + * Fix streaming not holding ref when stream error (CASSANDRA-9295)
 + * Fix canonical view returning early opened SSTables (CASSANDRA-9396)
 +Merged from 2.0:
+  * Fix bad condition in RangeTombstoneList (CASSANDRA-9485)
   * Fix potential StackOverflow when setting CrcCheckChance over JMX (CASSANDRA-9488)
   * Fix null static columns in pages after the first, paged reversed
     queries (CASSANDRA-8502)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/e1a67a4f/src/java/org/apache/cassandra/db/RangeTombstoneList.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/db/RangeTombstoneList.java
index c0ab42b,165718e..bd6e669
--- a/src/java/org/apache/cassandra/db/RangeTombstoneList.java
+++ b/src/java/org/apache/cassandra/db/RangeTombstoneList.java
@@@ -146,10 -116,10 +146,10 @@@ public class RangeTombstoneList impleme
      /**
       * Adds a new range tombstone.
       *
-      * This method will be faster if the new tombstone sort after all the currently existing ones (this is a common use case), 
+      * This method will be faster if the new tombstone sort after all the currently existing ones (this is a common use case),
       * but it doesn't assume it.
       */
 -    public void add(ByteBuffer start, ByteBuffer end, long markedAt, int delTime)
 +    public void add(Composite start, Composite end, long markedAt, int delTime)
      {
          if (isEmpty())
          {

http://git-wip-us.apache.org/repos/asf/cassandra/blob/e1a67a4f/test/unit/org/apache/cassandra/db/RangeTombstoneListTest.java
----------------------------------------------------------------------
diff --cc test/unit/org/apache/cassandra/db/RangeTombstoneListTest.java
index 712cfa2,2a7c90f..7dc7300
--- a/test/unit/org/apache/cassandra/db/RangeTombstoneListTest.java
+++ b/test/unit/org/apache/cassandra/db/RangeTombstoneListTest.java
@@@ -30,179 -29,7 +30,178 @@@ import org.apache.cassandra.utils.ByteB
  
  public class RangeTombstoneListTest
  {
 -    private static final Comparator<ByteBuffer> cmp = IntegerType.instance;
 +    private static final Comparator<Composite> cmp = new SimpleDenseCellNameType(IntegerType.instance);
-     private static final Random rand = new Random();
 +
 +    @Test
 +    public void testDiff()
 +    {
 +        RangeTombstoneList superset;
 +        RangeTombstoneList subset;
 +        RangeTombstoneList diff;
 +        Iterator<RangeTombstone> iter;
 +
 +        // no difference
 +        superset = new RangeTombstoneList(cmp, 10);
 +        subset = new RangeTombstoneList(cmp, 10);
 +        superset.add(rt(1, 10, 10));
 +        superset.add(rt(20, 30, 10));
 +        superset.add(rt(40, 50, 10));
 +        subset.add(rt(1, 10, 10));
 +        subset.add(rt(20, 30, 10));
 +        subset.add(rt(40, 50, 10));
 +        assertNull( subset.diff(superset));
 +
 +        // all items in subset are contained by the first range in the superset
 +        superset = new RangeTombstoneList(cmp, 10);
 +        subset = new RangeTombstoneList(cmp, 10);
 +        subset.add(rt(1, 2, 3));
 +        subset.add(rt(3, 4, 4));
 +        subset.add(rt(5, 6, 5));
 +        superset.add(rt(1, 10, 10));
 +        superset.add(rt(20, 30, 10));
 +        superset.add(rt(40, 50, 10));
 +        diff = subset.diff(superset);
 +        iter = diff.iterator();
 +        assertRT(rt(1, 10, 10), iter.next());
 +        assertRT(rt(20, 30, 10), iter.next());
 +        assertRT(rt(40, 50, 10), iter.next());
 +        assertFalse(iter.hasNext());
 +
 +        // multiple subset RTs are contained by superset RTs
 +        superset = new RangeTombstoneList(cmp, 10);
 +        subset = new RangeTombstoneList(cmp, 10);
 +        subset.add(rt(1, 2, 1));
 +        subset.add(rt(3, 4, 2));
 +        subset.add(rt(5, 6, 3));
 +        superset.add(rt(1, 5, 2));
 +        superset.add(rt(5, 6, 3));
 +        superset.add(rt(6, 10, 2));
 +        diff = subset.diff(superset);
 +        iter = diff.iterator();
 +        assertRT(rt(1, 5, 2), iter.next());
 +        assertRT(rt(6, 10, 2), iter.next());
 +        assertFalse(iter.hasNext());
 +
 +        // the superset has one RT that covers the entire subset
 +        superset = new RangeTombstoneList(cmp, 10);
 +        subset = new RangeTombstoneList(cmp, 10);
 +        superset.add(rt(1, 50, 10));
 +        subset.add(rt(1, 10, 10));
 +        subset.add(rt(20, 30, 10));
 +        subset.add(rt(40, 50, 10));
 +        diff = subset.diff(superset);
 +        iter = diff.iterator();
 +        assertRT(rt(1, 50, 10), iter.next());
 +        assertFalse(iter.hasNext());
 +
 +        // the superset has one RT that covers the remainder of the subset
 +        superset = new RangeTombstoneList(cmp, 10);
 +        subset = new RangeTombstoneList(cmp, 10);
 +        superset.add(rt(1, 10, 10));
 +        superset.add(rt(20, 50, 10));
 +        subset.add(rt(1, 10, 10));
 +        subset.add(rt(20, 30, 10));
 +        subset.add(rt(40, 50, 10));
 +        diff = subset.diff(superset);
 +        iter = diff.iterator();
 +        assertRT(rt(20, 50, 10), iter.next());
 +        assertFalse(iter.hasNext());
 +
 +        // only the timestamp differs on one RT
 +        superset = new RangeTombstoneList(cmp, 10);
 +        subset = new RangeTombstoneList(cmp, 10);
 +        superset.add(rt(1, 10, 10));
 +        superset.add(rt(20, 30, 20));
 +        superset.add(rt(40, 50, 10));
 +        subset.add(rt(1, 10, 10));
 +        subset.add(rt(20, 30, 10));
 +        subset.add(rt(40, 50, 10));
 +        diff = subset.diff(superset);
 +        iter = diff.iterator();
 +        assertRT(rt(20, 30, 20), iter.next());
 +        assertFalse(iter.hasNext());
 +
 +        // superset has a large range on an RT at the start
 +        superset = new RangeTombstoneList(cmp, 10);
 +        subset = new RangeTombstoneList(cmp, 10);
 +        superset.add(rt(1, 10, 10));
 +        superset.add(rt(20, 30, 10));
 +        superset.add(rt(40, 50, 10));
 +        subset.add(rt(1, 2, 3));
 +        subset.add(rt(20, 30, 10));
 +        subset.add(rt(40, 50, 10));
 +        diff = subset.diff(superset);
 +        iter = diff.iterator();
 +        assertRT(rt(1, 10, 10), iter.next());
 +        assertFalse(iter.hasNext());
 +
 +        // superset has a larger range on an RT in the middle
 +        superset = new RangeTombstoneList(cmp, 10);
 +        subset = new RangeTombstoneList(cmp, 10);
 +        superset.add(rt(1, 10, 10));
 +        superset.add(rt(20, 30, 10));
 +        superset.add(rt(40, 50, 10));
 +        subset.add(rt(1, 10, 10));
 +        subset.add(rt(20, 25, 10));
 +        subset.add(rt(40, 50, 10));
 +        diff = subset.diff(superset);
 +        iter = diff.iterator();
 +        assertRT(rt(20, 30, 10), iter.next());
 +        assertFalse(iter.hasNext());
 +
 +        // superset has a larger range on an RT at the end
 +        superset = new RangeTombstoneList(cmp, 10);
 +        subset = new RangeTombstoneList(cmp, 10);
 +        superset.add(rt(1, 10, 10));
 +        superset.add(rt(20, 30, 10));
 +        superset.add(rt(40, 55, 10));
 +        subset.add(rt(1, 10, 10));
 +        subset.add(rt(20, 30, 10));
 +        subset.add(rt(40, 50, 10));
 +        diff = subset.diff(superset);
 +        iter = diff.iterator();
 +        assertRT(rt(40, 55, 10), iter.next());
 +        assertFalse(iter.hasNext());
 +
 +         // superset has one additional RT in the middle
 +        superset = new RangeTombstoneList(cmp, 10);
 +        subset = new RangeTombstoneList(cmp, 10);
 +        superset.add(rt(1, 10, 10));
 +        superset.add(rt(20, 30, 10));
 +        superset.add(rt(40, 50, 10));
 +        subset.add(rt(1, 10, 10));
 +        subset.add(rt(40, 50, 10));
 +        diff = subset.diff(superset);
 +        iter = diff.iterator();
 +        assertRT(rt(20, 30, 10), iter.next());
 +        assertFalse(iter.hasNext());
 +
 +        // superset has one additional RT at the start
 +        superset = new RangeTombstoneList(cmp, 10);
 +        subset = new RangeTombstoneList(cmp, 10);
 +        superset.add(rt(1, 10, 10));
 +        superset.add(rt(20, 30, 10));
 +        superset.add(rt(40, 50, 10));
 +        subset.add(rt(20, 30, 10));
 +        subset.add(rt(40, 50, 10));
 +        diff = subset.diff(superset);
 +        iter = diff.iterator();
 +        assertRT(rt(1, 10, 10), iter.next());
 +        assertFalse(iter.hasNext());
 +
 +        // superset has one additional RT at the end
 +        superset = new RangeTombstoneList(cmp, 10);
 +        subset = new RangeTombstoneList(cmp, 10);
 +        superset.add(rt(1, 10, 10));
 +        superset.add(rt(20, 30, 10));
 +        superset.add(rt(40, 50, 10));
 +        subset.add(rt(1, 10, 10));
 +        subset.add(rt(20, 30, 10));
 +        diff = subset.diff(superset);
 +        iter = diff.iterator();
 +        assertRT(rt(40, 50, 10), iter.next());
 +        assertFalse(iter.hasNext());
 +    }
  
      @Test
      public void sortedAdditionTest()
@@@ -512,7 -364,7 +530,8 @@@
              {
                  System.out.println("Error merging:");
                  System.out.println(" l1: " + toString(l1Initial));
 +                System.out.println(" l2: " + toString(l2));
+                 System.out.println("Seed was: " + seed);
                  throw e;
              }
          }