mirror of https://github.com/apache/cassandra
Consider first token of SSTable when calculating SSTable intersection in LeveledScanner
patch by Alan Wang; reviewed by David Capwell, Marcus Eriksson for CASSANDRA-21369
This commit is contained in:
parent
19ee803038
commit
41fd7c3e22
|
|
@ -1,4 +1,5 @@
|
||||||
4.0.21
|
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)
|
* Remove inFlightEcho entry on ECHO_REQ failure (CASSANDRA-21428)
|
||||||
* Validate snapshot names (CASSANDRA-21389)
|
* 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)
|
* BTree.FastBuilder.reset() fails to clear savedBuffer and savedNextKey, causing ClassCastException and SSTable header corruption during schema disagreement (CASSANDRA-21216, CASSANDRA-21260)
|
||||||
|
|
|
||||||
|
|
@ -382,7 +382,7 @@ public class LeveledCompactionStrategy extends AbstractCompactionStrategy
|
||||||
|
|
||||||
// Lazily creates SSTableBoundedScanner for sstable that are assumed to be from the
|
// Lazily creates SSTableBoundedScanner for sstable that are assumed to be from the
|
||||||
// same level (e.g. non overlapping) - see #4142
|
// 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 TableMetadata metadata;
|
||||||
private final Collection<Range<Token>> ranges;
|
private final Collection<Range<Token>> ranges;
|
||||||
|
|
@ -437,8 +437,7 @@ public class LeveledCompactionStrategy extends AbstractCompactionStrategy
|
||||||
{
|
{
|
||||||
for (SSTableReader sstable : sstables)
|
for (SSTableReader sstable : sstables)
|
||||||
{
|
{
|
||||||
Range<Token> sstableRange = new Range<>(sstable.first.getToken(), sstable.last.getToken());
|
if (range == null || range.intersects(sstable.getBounds()))
|
||||||
if (range == null || sstableRange.intersects(range))
|
|
||||||
filtered.add(sstable);
|
filtered.add(sstable);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -70,6 +70,7 @@ import org.apache.cassandra.utils.Pair;
|
||||||
import org.awaitility.Awaitility;
|
import org.awaitility.Awaitility;
|
||||||
|
|
||||||
import static java.util.Collections.singleton;
|
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.assertj.core.api.Assertions.assertThat;
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertFalse;
|
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)
|
private Pair<Set<SSTableReader>, Set<SSTableReader>> groupByLevel(Iterable<SSTableReader> sstables)
|
||||||
{
|
{
|
||||||
Set<SSTableReader> l1after = new HashSet<>();
|
Set<SSTableReader> l1after = new HashSet<>();
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue