Repository navigation
Fix merge and search with an empty multivector placeholder - #10870
Merged
Merged
Conversation
A named multivector added to an existing segment is backed by an EmptyDense placeholder that carries a multivector config. Merging it into a multi-dense target failed with "source is not a f32 multi-dense storage", and a multivector query against it failed with a multi/regular conversion error. Read it as one zero inner vector per deleted slot when merging, and score multivector queries through a multi-dense view of the placeholder. Fixes qdrant#10857
Read an EmptyDense placeholder as zeros in the dense uint8/float16 and multi uint8/float16 merge readers too, not only float32. Turbo readers are left out: their record size comes from the target's quantizer. Make the multivector view expect a multivector config instead of inventing MaxSim, score the placeholder in the raw scorer test, and move test imports to module level.
IvanPleshkov
self-requested a review
October 1, 2026 10:33
A named Turbo4 vector added to an existing segment is backed by an EmptyDense placeholder. Merging it into a turbo target failed with "source is not a turbo storage" (or "multi turbo storage"), turning the collection red. Read it as one zero record per deleted slot, the same bytes turbo storages write for their own deleted slots. The record size depends only on dim and distance, so compute it without building a quantizer. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
Cover the single-file, appendable and multivector turbo targets, and pin the record size helper to the quantizer it mirrors. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
Replace the per-storage merge tests with one parametrized test that opens each target through open_vector_storage, as the segment builder does: every datatype, dense and multivector, single-file and appendable. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
timvisee
approved these changes
Oct 1, 2026
timvisee
left a comment
Member
There was a problem hiding this comment.
Thanks for picking this up!
I've added some changes to apply the same treatment elsewhere.
xzfc
approved these changes
Oct 1, 2026
timvisee
added a commit
that referenced
this pull request
Oct 5, 2026
* Support empty multivector placeholder in merge and search A named multivector added to an existing segment is backed by an EmptyDense placeholder that carries a multivector config. Merging it into a multi-dense target failed with "source is not a f32 multi-dense storage", and a multivector query against it failed with a multi/regular conversion error. Read it as one zero inner vector per deleted slot when merging, and score multivector queries through a multi-dense view of the placeholder. Fixes #10857 * Cover uint8 and float16 placeholders in merge, tidy multivector view Read an EmptyDense placeholder as zeros in the dense uint8/float16 and multi uint8/float16 merge readers too, not only float32. Turbo readers are left out: their record size comes from the target's quantizer. Make the multivector view expect a multivector config instead of inventing MaxSim, score the placeholder in the raw scorer test, and move test imports to module level. * Support empty Turbo4 placeholder in merge A named Turbo4 vector added to an existing segment is backed by an EmptyDense placeholder. Merging it into a turbo target failed with "source is not a turbo storage" (or "multi turbo storage"), turning the collection red. Read it as one zero record per deleted slot, the same bytes turbo storages write for their own deleted slots. The record size depends only on dim and distance, so compute it without building a quantizer. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]> * Test merging empty Turbo4 placeholders Cover the single-file, appendable and multivector turbo targets, and pin the record size helper to the quantizer it mirrors. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]> * Consolidate empty placeholder merge tests Replace the per-storage merge tests with one parametrized test that opens each target through open_vector_storage, as the segment builder does: every datatype, dense and multivector, single-file and appendable. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]> --------- Co-authored-by: timvisee <[email protected]> Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]>
Member
|
This is included in Qdrant 1.19.2. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #10857.
adding a multivector to an indexed collection broke merges and search because of the empty placeholder, this makes merge and search accept it, tests for f32/u8/f16
Both commits are AI-made (Claude Code). Initial prompt: "Fix #10857: adding a multivector named vector to an indexed collection breaks the optimizer merge and queries; add regression tests."
All Submissions:
devbranch (notmaster) and my branch was created fromdev.New Feature Submissions:
cargo +nightly fmt --allcommand prior to submission?cargo clippy --workspace --all-featurescommand?Changes to Core Features: