Merge branch 'cassandra-4.0' into cassandra-4.1

This commit is contained in:
David Capwell 2026-06-16 10:38:42 -07:00
commit 2949c8ed22
3 changed files with 30 additions and 3 deletions

View File

@ -2,6 +2,7 @@
* 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

@ -387,7 +387,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;
@ -442,8 +442,7 @@ public class LeveledCompactionStrategy extends AbstractCompactionStrategy
{
for (SSTableReader sstable : sstables)
{
Range<Token> 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);
}
}

View File

@ -71,6 +71,7 @@ import org.apache.cassandra.utils.TimeUUID;
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.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
import static org.junit.Assert.assertEquals;
@ -1039,6 +1040,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<>();