Merge branch 'cassandra-5.0' into cassandra-6.0

This commit is contained in:
David Capwell 2026-06-16 10:44:39 -07:00
commit 6c44f0561b
3 changed files with 30 additions and 3 deletions

View File

@ -58,6 +58,7 @@ Merged from 4.1:
* Add Paxos v2 option and informatin in cassandra.yaml (CASSANDRA-21316)
* Harden data resurrection startup check with atomic heartbeat file write with fallback (CASSANDRA-21290)
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)
* BTree.FastBuilder.reset() fails to clear savedBuffer and savedNextKey, causing ClassCastException and SSTable header corruption during schema disagreement (CASSANDRA-21216, CASSANDRA-21260)

View File

@ -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<UnfilteredRowIterator> implements ISSTableScanner
protected static class LeveledScanner extends AbstractIterator<UnfilteredRowIterator> implements ISSTableScanner
{
private final TableMetadata metadata;
private final Collection<Range<Token>> ranges;
@ -465,8 +465,7 @@ public class LeveledCompactionStrategy extends AbstractCompactionStrategy
{
for (SSTableReader sstable : sstables)
{
Range<Token> 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);
}
}

View File

@ -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<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<>();