From 53cd2d8286ebd6b44cfc44881daebba9dce69b5d Mon Sep 17 00:00:00 2001 From: Ekaterina Dimitrova Date: Fri, 9 Feb 2024 13:09:39 -0500 Subject: [PATCH] Fix VectorMemoryIndex#update logic to compare vectors Fix Index view patch by Ekaterina Dimitrova; reviewed by Andres de la Pena for CASSANDRA-19168 --- CHANGES.txt | 1 + .../index/sai/memory/VectorMemoryIndex.java | 3 +-- .../cassandra/index/sai/view/RangeTermTree.java | 15 ++++++--------- .../org/apache/cassandra/index/sai/view/View.java | 3 ++- 4 files changed, 10 insertions(+), 12 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index d02922f756..20e0c6e959 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 5.0-beta2 + * Fix VectorMemoryIndex#update logic to compare vectors. Fix Index view (CASSANDRA-19168) * Deprecate native_transport_port_ssl (CASSANDRA-19392) * Update packaging shell includes (CASSANDRA-19283) * Fix data corruption in VectorCodec when using heap buffers (CASSANDRA-19167) diff --git a/src/java/org/apache/cassandra/index/sai/memory/VectorMemoryIndex.java b/src/java/org/apache/cassandra/index/sai/memory/VectorMemoryIndex.java index 52ae0b8baa..ad94f4475d 100644 --- a/src/java/org/apache/cassandra/index/sai/memory/VectorMemoryIndex.java +++ b/src/java/org/apache/cassandra/index/sai/memory/VectorMemoryIndex.java @@ -29,7 +29,6 @@ import java.util.concurrent.ConcurrentSkipListSet; import java.util.concurrent.atomic.LongAdder; import java.util.function.Function; import java.util.stream.Collectors; -import java.util.stream.IntStream; import javax.annotation.Nullable; import io.github.jbellis.jvector.util.Bits; @@ -111,7 +110,7 @@ public class VectorMemoryIndex extends MemoryIndex } else { - different = IntStream.range(0, oldRemaining).anyMatch(i -> oldValue.get(i) != newValue.get(i)); + different = index.termType().compare(oldValue, newValue) != 0; } long bytesUsed = 0; diff --git a/src/java/org/apache/cassandra/index/sai/view/RangeTermTree.java b/src/java/org/apache/cassandra/index/sai/view/RangeTermTree.java index b2b1803e37..2da7acfb19 100644 --- a/src/java/org/apache/cassandra/index/sai/view/RangeTermTree.java +++ b/src/java/org/apache/cassandra/index/sai/view/RangeTermTree.java @@ -73,14 +73,8 @@ public class RangeTermTree public final void add(SSTableIndex index) { - addIndex(index); + assert !indexTermType.isVector(); - min = min == null || index.getIndexTermType().compare(min, index.minTerm()) > 0 ? index.minTerm() : min; - max = max == null || index.getIndexTermType().compare(max, index.maxTerm()) < 0 ? index.maxTerm() : max; - } - - public void addIndex(SSTableIndex index) - { Interval interval = Interval.create(new Term(index.minTerm(), indexTermType), new Term(index.maxTerm(), indexTermType), index); @@ -88,11 +82,14 @@ public class RangeTermTree { logger.trace(index.getIndexIdentifier().logMessage("Adding index for SSTable {} with minTerm={} and maxTerm={}..."), index.getSSTable().descriptor, - indexTermType.indexType().compose(index.minTerm()), - indexTermType.indexType().compose(index.maxTerm())); + index.minTerm() != null ? indexTermType.indexType().compose(index.minTerm()) : null, + index.maxTerm() != null ? indexTermType.indexType().compose(index.maxTerm()) : null); } intervals.add(interval); + + min = min == null || index.getIndexTermType().compare(min, index.minTerm()) > 0 ? index.minTerm() : min; + max = max == null || index.getIndexTermType().compare(max, index.maxTerm()) < 0 ? index.maxTerm() : max; } public RangeTermTree build() diff --git a/src/java/org/apache/cassandra/index/sai/view/View.java b/src/java/org/apache/cassandra/index/sai/view/View.java index 323eb24a7f..2e30d61422 100644 --- a/src/java/org/apache/cassandra/index/sai/view/View.java +++ b/src/java/org/apache/cassandra/index/sai/view/View.java @@ -52,7 +52,8 @@ public class View implements Iterable for (SSTableIndex sstableIndex : indexes) { this.view.put(sstableIndex.getSSTable().descriptor, sstableIndex); - rangeTermTreeBuilder.add(sstableIndex); + if (!indexTermType.isVector()) + rangeTermTreeBuilder.add(sstableIndex); } this.rangeTermTree = rangeTermTreeBuilder.build();