diff --git a/src/java/org/apache/cassandra/db/compaction/LeveledCompactionStrategy.java b/src/java/org/apache/cassandra/db/compaction/LeveledCompactionStrategy.java index a39e14bf25d3..59c163f08e97 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 @@ protected Set getSSTables() // 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 implements ISSTableScanner + protected static class LeveledScanner extends AbstractIterator implements ISSTableScanner { private final TableMetadata metadata; private final Collection> ranges; @@ -437,8 +437,7 @@ public static Collection intersecting(Collection s { for (SSTableReader sstable : sstables) { - Range 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 f741e1e9974c..b72cfe7f9d95 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.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 void testNoHighLevelReduction() throws IOException } } + @Test + public void testLevelScannerIntersection() + { + Collection sstable = Collections.singleton(MockSchema.sstableWithLevel(1, 10, 20, 1, cfs)); + + // SSTable range - [10, 20] + // range - (1, 9] + Range 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> groupByLevel(Iterable sstables) { Set l1after = new HashSet<>();