You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by dc...@apache.org on 2026/06/16 20:46:36 UTC
(cassandra) branch cassandra-4.0 updated: Consider first token of SSTable when calculating SSTable intersection in LeveledScanner
This is an automated email from the ASF dual-hosted git repository.
asf-gitbox-commits pushed a commit to branch cassandra-4.0
in repository https://gitbox.apache.org/repos/asf/cassandra.git
The following commit(s) were added to refs/heads/cassandra-4.0 by this push:
new 41fd7c3e22 Consider first token of SSTable when calculating SSTable intersection in LeveledScanner
41fd7c3e22 is described below
commit 41fd7c3e22e36cb8a1f83cebf07804fbc19c82eb
Author: Alan Wang <al...@gmail.com>
AuthorDate: Tue Jun 16 09:32:06 2026 -0700
Consider first token of SSTable when calculating SSTable intersection in LeveledScanner
patch by Alan Wang; reviewed by David Capwell, Marcus Eriksson for CASSANDRA-21369
---
CHANGES.txt | 1 +
.../db/compaction/LeveledCompactionStrategy.java | 5 ++--
.../compaction/LeveledCompactionStrategyTest.java | 27 ++++++++++++++++++++++
3 files changed, 30 insertions(+), 3 deletions(-)
diff --git a/CHANGES.txt b/CHANGES.txt
index e762fb3ec7..5e6426fbc0 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
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)
* 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)
diff --git a/src/java/org/apache/cassandra/db/compaction/LeveledCompactionStrategy.java b/src/java/org/apache/cassandra/db/compaction/LeveledCompactionStrategy.java
index a39e14bf25..59c163f08e 100644
--- a/src/java/org/apache/cassandra/db/compaction/LeveledCompactionStrategy.java
+++ b/src/java/org/apache/cassandra/db/compaction/LeveledCompactionStrategy.java
@@ -382,7 +382,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;
@@ -437,8 +437,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);
}
}
diff --git a/test/unit/org/apache/cassandra/db/compaction/LeveledCompactionStrategyTest.java b/test/unit/org/apache/cassandra/db/compaction/LeveledCompactionStrategyTest.java
index f741e1e997..b72cfe7f9d 100644
--- a/test/unit/org/apache/cassandra/db/compaction/LeveledCompactionStrategyTest.java
+++ b/test/unit/org/apache/cassandra/db/compaction/LeveledCompactionStrategyTest.java
@@ -70,6 +70,7 @@ import org.apache.cassandra.utils.Pair;
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.junit.Assert.assertEquals;
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)
{
Set<SSTableReader> l1after = new HashSet<>();
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cassandra.apache.org
For additional commands, e-mail: commits-help@cassandra.apache.org