This is an automated email from the ASF dual-hosted git repository.

jmckenzie pushed a commit to branch cassandra-4.0
in repository https://gitbox.apache.org/repos/asf/cassandra.git


The following commit(s) were added to refs/heads/cassandra-4.0 by this push:
     new 29c0ad80c9 Fix repair failure on assertion if two peers have 
overlapping mismatching ranges
29c0ad80c9 is described below

commit 29c0ad80c919f02585f3ddfd7f9e0d2e80b62e2b
Author: Josh McKenzie <jmcken...@apache.org>
AuthorDate: Fri Sep 16 15:50:44 2022 -0400

    Fix repair failure on assertion if two peers have overlapping mismatching 
ranges
    
    Patch by Marcus Eriksson; reviewed by Benedict Elliott Smith and Josh 
McKenzie for CASSANDRA-17900
    
    Co-authored-by: Marcus Eriksson <marc...@apache.org>
    Co-authored-by: Josh McKenzie <jmcken...@apache.org>
---
 CHANGES.txt                                                |  1 +
 .../org/apache/cassandra/repair/asymmetric/RangeMap.java   | 10 ++++++----
 .../apache/cassandra/repair/asymmetric/RangeMapTest.java   | 14 ++++++++++++--
 3 files changed, 19 insertions(+), 6 deletions(-)

diff --git a/CHANGES.txt b/CHANGES.txt
index c78d97d61c..22bebd6e88 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 4.0.7
+ * Fix repair failure on assertion if two peers have overlapping mismatching 
ranges (CASSANDRA-17900)
  * Better handle null state in Gossip schema migration to avoid NPE 
(CASSANDRA-17864)
  * HintedHandoffAddRemoveNodesTest now accounts for the fact that 
StorageMetrics.totalHints is not updated synchronously w/ writes 
(CASSANDRA-16679)
  * Avoid getting hanging repairs due to repair message timeouts 
(CASSANDRA-17613)
diff --git a/src/java/org/apache/cassandra/repair/asymmetric/RangeMap.java 
b/src/java/org/apache/cassandra/repair/asymmetric/RangeMap.java
index f957b1b443..224b987af1 100644
--- a/src/java/org/apache/cassandra/repair/asymmetric/RangeMap.java
+++ b/src/java/org/apache/cassandra/repair/asymmetric/RangeMap.java
@@ -156,11 +156,13 @@ public class RangeMap<T> implements Map<Range<Token>, T>
         }
         protected Map.Entry<Range<Token>, T> computeNext()
         {
-            if ((currentIter == null || !currentIter.hasNext()) && 
iterators.hasNext())
+            while (currentIter == null || !currentIter.hasNext())
+            {
+                if (!iterators.hasNext())
+                    return endOfData();
                 currentIter = iterators.next();
-            if (currentIter != null && currentIter.hasNext())
-                return currentIter.next();
-            return endOfData();
+            }
+            return currentIter.next();
         }
     }
 
diff --git a/test/unit/org/apache/cassandra/repair/asymmetric/RangeMapTest.java 
b/test/unit/org/apache/cassandra/repair/asymmetric/RangeMapTest.java
index 0805ea7756..a4327caa01 100644
--- a/test/unit/org/apache/cassandra/repair/asymmetric/RangeMapTest.java
+++ b/test/unit/org/apache/cassandra/repair/asymmetric/RangeMapTest.java
@@ -33,6 +33,7 @@ import org.apache.cassandra.dht.Token;
 
 import static junit.framework.TestCase.assertEquals;
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
 
 public class RangeMapTest
 {
@@ -51,8 +52,8 @@ public class RangeMapTest
             for (Range<Token> range : randomRanges)
                 rangeMap.put(range, i++);
 
-            long a = r.nextLong() % 100000;
-            long b = r.nextLong() % 100000;
+            long a = r.nextLong() % 1000000;
+            long b = r.nextLong() % 1000000;
             if (a == b) b++;
 
             Range<Token> intersectionRange = r(a, b);
@@ -103,4 +104,13 @@ public class RangeMapTest
         RangeMap<Integer> rmap = new RangeMap<>();
         assertFalse(rmap.intersectingEntryIterator(r(1, 10)).hasNext());
     }
+
+    @Test
+    public void testWrap()
+    {
+        RangeMap<Integer> rangeMap = new RangeMap<>();
+        rangeMap.put(r(5, 10), 1);
+        rangeMap.removeIntersecting(r(100, 50));
+        assertTrue(rangeMap.isEmpty());
+    }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org
For additional commands, e-mail: commits-h...@cassandra.apache.org

Reply via email to