From 64c7636f2ac939ab46bec7c1fb5f6a23288c1930 Mon Sep 17 00:00:00 2001 From: Alan Wang Date: Mon, 18 May 2026 19:07:31 -0700 Subject: [PATCH] fix --- .../compaction/LeveledCompactionStrategy.java | 5 ++-- .../LeveledCompactionStrategyTest.java | 27 +++++++++++++++++++ 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/java/org/apache/cassandra/db/compaction/LeveledCompactionStrategy.java b/src/java/org/apache/cassandra/db/compaction/LeveledCompactionStrategy.java index a09dc7262a98..37c6e95f0381 100644 --- a/src/java/org/apache/cassandra/db/compaction/LeveledCompactionStrategy.java +++ b/src/java/org/apache/cassandra/db/compaction/LeveledCompactionStrategy.java @@ -389,7 +389,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; @@ -444,8 +444,7 @@ public static Collection intersecting(Collection s { for (SSTableReader sstable : sstables) { - Range sstableRange = new Range<>(sstable.getFirst().getToken(), sstable.getLast().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 114596ba7492..793b3d7743b4 100644 --- a/test/unit/org/apache/cassandra/db/compaction/LeveledCompactionStrategyTest.java +++ b/test/unit/org/apache/cassandra/db/compaction/LeveledCompactionStrategyTest.java @@ -75,6 +75,7 @@ import org.awaitility.Awaitility; import static java.util.Collections.singleton; +import static org.apache.cassandra.schema.MockSchema.readerBounds; import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.assertEquals; @@ -1048,6 +1049,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<>();