diff --git a/CHANGES.txt b/CHANGES.txt index cae6a43c50..30203a0bb0 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -46,6 +46,7 @@ Merged from 5.0: * Use estimated compressed size for tables to check if there is enough free space for a compaction (CASSANDRA-21245) * Fix failing select on system_views.settings for non-string keys (CASSANDRA-21348) Merged from 4.0: + * 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) diff --git a/src/java/org/apache/cassandra/db/compaction/LeveledCompactionStrategy.java b/src/java/org/apache/cassandra/db/compaction/LeveledCompactionStrategy.java index a22f06e562..609052c047 100644 --- a/src/java/org/apache/cassandra/db/compaction/LeveledCompactionStrategy.java +++ b/src/java/org/apache/cassandra/db/compaction/LeveledCompactionStrategy.java @@ -405,7 +405,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 implements ISSTableScanner + protected static class LeveledScanner extends AbstractIterator implements ISSTableScanner { private final TableMetadata metadata; private final Collection> ranges; @@ -465,8 +465,7 @@ public class LeveledCompactionStrategy extends AbstractCompactionStrategy { 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 954bc312c1..0aeab98f79 100644 --- a/test/unit/org/apache/cassandra/db/compaction/LeveledCompactionStrategyTest.java +++ b/test/unit/org/apache/cassandra/db/compaction/LeveledCompactionStrategyTest.java @@ -76,6 +76,7 @@ import org.apache.cassandra.utils.Pair; import org.apache.cassandra.utils.TimeUUID; 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; @@ -1061,6 +1062,32 @@ public class LeveledCompactionStrategyTest } } + @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<>();