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

asf-gitbox-commits 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 41fd7c3e22 Consider first token of SSTable when calculating SSTable 
intersection in LeveledScanner
41fd7c3e22 is described below

commit 41fd7c3e22e36cb8a1f83cebf07804fbc19c82eb
Author: Alan Wang <[email protected]>
AuthorDate: Tue Jun 16 09:32:06 2026 -0700

    Consider first token of SSTable when calculating SSTable intersection in 
LeveledScanner
    
    patch by Alan Wang; reviewed by David Capwell, Marcus Eriksson for 
CASSANDRA-21369
---
 CHANGES.txt                                        |  1 +
 .../db/compaction/LeveledCompactionStrategy.java   |  5 ++--
 .../compaction/LeveledCompactionStrategyTest.java  | 27 ++++++++++++++++++++++
 3 files changed, 30 insertions(+), 3 deletions(-)

diff --git a/CHANGES.txt b/CHANGES.txt
index e762fb3ec7..5e6426fbc0 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 4.0.21
+ * Consider first token of SSTable when calculating SSTable intersection in 
LeveledScanner  (CASSANDRA-21369)
  * Remove inFlightEcho entry on ECHO_REQ failure (CASSANDRA-21428)
  * Validate snapshot names (CASSANDRA-21389)
  * BTree.FastBuilder.reset() fails to clear savedBuffer and savedNextKey, 
causing ClassCastException and SSTable header corruption during schema 
disagreement (CASSANDRA-21216, CASSANDRA-21260)
diff --git 
a/src/java/org/apache/cassandra/db/compaction/LeveledCompactionStrategy.java 
b/src/java/org/apache/cassandra/db/compaction/LeveledCompactionStrategy.java
index a39e14bf25..59c163f08e 100644
--- a/src/java/org/apache/cassandra/db/compaction/LeveledCompactionStrategy.java
+++ b/src/java/org/apache/cassandra/db/compaction/LeveledCompactionStrategy.java
@@ -382,7 +382,7 @@ public class LeveledCompactionStrategy extends 
AbstractCompactionStrategy
 
     // Lazily creates SSTableBoundedScanner for sstable that are assumed to be 
from the
     // same level (e.g. non overlapping) - see #4142
-    private static class LeveledScanner extends 
AbstractIterator<UnfilteredRowIterator> implements ISSTableScanner
+    protected static class LeveledScanner extends 
AbstractIterator<UnfilteredRowIterator> implements ISSTableScanner
     {
         private final TableMetadata metadata;
         private final Collection<Range<Token>> ranges;
@@ -437,8 +437,7 @@ public class LeveledCompactionStrategy extends 
AbstractCompactionStrategy
             {
                 for (SSTableReader sstable : sstables)
                 {
-                    Range<Token> sstableRange = new 
Range<>(sstable.first.getToken(), sstable.last.getToken());
-                    if (range == null || sstableRange.intersects(range))
+                    if (range == null || range.intersects(sstable.getBounds()))
                         filtered.add(sstable);
                 }
             }
diff --git 
a/test/unit/org/apache/cassandra/db/compaction/LeveledCompactionStrategyTest.java
 
b/test/unit/org/apache/cassandra/db/compaction/LeveledCompactionStrategyTest.java
index f741e1e997..b72cfe7f9d 100644
--- 
a/test/unit/org/apache/cassandra/db/compaction/LeveledCompactionStrategyTest.java
+++ 
b/test/unit/org/apache/cassandra/db/compaction/LeveledCompactionStrategyTest.java
@@ -70,6 +70,7 @@ import org.apache.cassandra.utils.Pair;
 import org.awaitility.Awaitility;
 
 import static java.util.Collections.singleton;
+import static org.apache.cassandra.schema.MockSchema.readerBounds;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -990,6 +991,32 @@ public class LeveledCompactionStrategyTest
         }
     }
 
+    @Test
+    public void testLevelScannerIntersection()
+    {
+        Collection<SSTableReader> sstable = 
Collections.singleton(MockSchema.sstableWithLevel(1, 10, 20, 1, cfs));
+
+        // SSTable range - [10, 20]
+        // range - (1, 9]
+        Range<Token> range = new Range<>(readerBounds(1).getToken(), 
readerBounds(9).getToken());
+        assertEquals(0, 
LeveledCompactionStrategy.LeveledScanner.intersecting(sstable, 
Collections.singleton(range)).size());
+
+        // SSTable range - [10, 20]
+        // range - (1, 10]
+        range = new Range<>(readerBounds(1).getToken(), 
readerBounds(10).getToken());
+        assertEquals(1, 
LeveledCompactionStrategy.LeveledScanner.intersecting(sstable, 
Collections.singleton(range)).size());
+
+        // SSTable range - [10, 20]
+        // range - (1, 15]
+        range = new Range<>(readerBounds(1).getToken(), 
readerBounds(15).getToken());
+        assertEquals(1, 
LeveledCompactionStrategy.LeveledScanner.intersecting(sstable, 
Collections.singleton(range)).size());
+
+        // SSTable range - [10, 20]
+        // range - (20, 25]
+        range = new Range<>(readerBounds(20).getToken(), 
readerBounds(25).getToken());
+        assertEquals(0, 
LeveledCompactionStrategy.LeveledScanner.intersecting(sstable, 
Collections.singleton(range)).size());
+    }
+
     private Pair<Set<SSTableReader>, Set<SSTableReader>> 
groupByLevel(Iterable<SSTableReader> sstables)
     {
         Set<SSTableReader> l1after = new HashSet<>();


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to