Commit Graph
6300 Commits
Author SHA1 Message Date
Tim Visée fad822a26a Enable the single_file_mmap_vector_storage flag by default (#9332)
* Enable the `single_file_mmap_vector_storage` flag by default

* Update comment on when flag is enabled by default

* Update OpenAPI spec

* Fix tests
2026-08-04 11:16:53 +02:00
tellet-qandClaude Opus 4.8 16c8e53608 feat(model_testing): add --duration-sec to run for a fixed wall-clock time (#9506)
* feat(model_testing): add --duration-sec to run for a fixed wall-clock time

Bound the soak by wall-clock time instead of op count: when --duration-sec is set, the loop runs until the deadline (or Ctrl-C) and --op-num is ignored.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* Fix clippy

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-04 11:16:53 +02:00
qdrant-cloud-botandCursor 331f4b1330 test(model_testing): add has_vector matcher to generated scroll filter (#9510)
Extend ScrollFilter with a HasVector variant so paginated scroll
exercises Condition::HasVector. The matcher targets an active vector
name, and the model verifier checks it against each point's populated
vector set (which varies via DeleteVectors / partial UpdateVectors),
restricting results to a known, model-checkable subset.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-04 11:16:53 +02:00
qdrant-cloud-botandCursor ae322c131a docs: clarify purpose of /healthz, /livez and /readyz endpoints (#9509)
Previously all three Kubernetes health endpoints shared the same generic
description ("An endpoint for health checking used in Kubernetes."), which did
not convey what each one actually guarantees.

- /healthz and /livez: clarify they are pure liveness checks (200 once the HTTP
  API is up), do not inspect data/shards/consensus, and are identical to each
  other.
- /readyz: clarify it is a readiness probe that waits out pending data
  operations (consensus catch-up + shard health in distributed mode) before
  reporting ready, and document the real 200 ("all shards are ready") and 503
  ("some shards are not ready") responses.

Documentation-only change (OpenAPI descriptions/examples + added 503 response
doc). No runtime behavior changes.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-04 11:16:53 +02:00
Arnaud GourlayandClaude Opus 4.8 afb7fe0c98 Buffer multi-dense offsets store to prevent reload corruption (#9501)
* Buffer multi-dense offsets store to prevent reload corruption

The appendable multi-dense storage flushes its `vectors` and `offsets`
chunked stores independently. Each flusher snapshots its `status.len` at
creation time but msyncs chunk bytes at execution time. A re-upsert that
grows a point past its reserved capacity rewrites the point's `offsets`
entry in place to a freshly-appended row region; if that lands in a
flush's creation-to-execution window, the relocated entry becomes durable
while the `vectors` store's recorded length still predates the rows it
references. On reload that point is unreadable and a WAL append reuses the
rows, clobbering another point.

Wrap the offsets store in a write-back buffer (`BufferedOffsets`) so the
durable offsets can never reference rows beyond the durable `vectors`
length. Offset writes stage in a pending overlay and only land in the
durable store while a flush executes; the flusher snapshots the pending
set at creation time, so any write after that stays buffered for the next
flush. Both flushers snapshot at the same instant, yielding a consistent
durable cut. Rows written after the cut are unreferenced garbage the next
append overwrites. This prevents the skew at the source instead of
patching it on reload, and also closes the residual offsets-length smear.

The buffer follows the Gridstore flusher convention: pending writes live
inside the single lock-guarded store, reads consult the overlay then the
durable bytes under one lock, and the durable msync runs after releasing
the write lock so it never stalls concurrent reads.

Enable the "m" multivector in the collection model test now that its
reload divergence is resolved.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* Narrow offsets flush write-lock scope

Build and sort the pending snapshot before taking the write lock; only the
apply + reconcile need it. Shortens the lock hold so concurrent reads block
less. Addresses review feedback.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-04 11:16:52 +02:00
3a3a57b186 perf: use Entry API to avoid redundant map double-lookups (#9500)
* perf: use Entry API to avoid redundant map double-lookups

Replace get_mut/contains_key followed by insert with the entry API
across several maps, collapsing two hash lookups into one. Limited to
sites where the key is Copy or already owned and moved, so no extra
key clone is added to any hot path.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* More Entry API usage in mutable_geo_index

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: xzfc <xzfcpw@gmail.com>
2026-08-04 11:16:52 +02:00
Daniel BorosandLuis Cossío c02ad2b3e0 feat: ReadOnlySegment::open (S3-verified) (#9466)
* feat: ReadOnlyStructPayloadIndex::open

* use expect instead of allow

* fix: review comments

* fix: read immutable dense vector count through fs

* feat: ReadOnlySegment::open + read-only segment over S3 test

* fix: linter

* rename + TODO

---------

Co-authored-by: Luis Cossío <luis.cossio@outlook.com>
2026-08-04 11:16:52 +02:00
Daniel BorosandLuis Cossío e31b6d1e0d feat: ReadOnlyStructPayloadIndex::open (#9465)
* feat: ReadOnlyStructPayloadIndex::open

* use expect instead of allow

* fix: review comments

---------

Co-authored-by: Luis Cossío <luis.cossio@outlook.com>
2026-08-04 11:16:52 +02:00
qdrant-cloud-botandCursor 10777867e1 test(model_testing): add has_id matcher to generated scroll filter (#9499)
* test(model_testing): add has_id matcher to generated scroll filter

Extend the ScrollPaged filter selector with a HasId variant so the
generated filter exercises a has_id matcher (restrict to an explicit
point-id set), in addition to the existing none / num / tag filters.

The id set mixes ids present in the model with ids drawn from the id pool
that may not be, so the matcher meaningfully restricts. The model mirrors
it with a set-membership predicate, and the existing paged-scroll
id-set assertion validates the engine result.

Co-authored-by: Cursor <cursoragent@cursor.com>

* chore: fix clippy lints (wildcard_enum_match_arm, from_iter_instead_of_collect)

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(model_testing): clamp has_id sample count to id_pool

Addresses CodeRabbit review: random_distinct_ids could spin forever when
the requested distinct count (up to 15) exceeds id_pool. Clamp to
id_pool.min(15). Only relevant for tiny --id-pool values; the default
pool (500) is far above 15.

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-04 11:16:52 +02:00
xzfc 5b9539fec7 Remove callback-based ConditionChecker (#9487)
* Add BoolConditionChecker

* Add IsEmptyConditionChecker, IsNullConditionChecker

* Add RangeConditionChecker

* Add GeoConditionChecker

* MapIndexRead: move <'a> to the trait level

Reason: avoid repetetive `where N: 'a` in every method

* Add MapConditionChecker

* Add ConstantConditionChecker

* Add FullTextConditionChecker

* Add {Ids,HasVector,Payload}ConditionChecker

* Get rid of fn-based ConditionChecker
2026-08-04 11:16:52 +02:00
qdrant-cloud-botandCursor 13203e13d9 test(model_testing): cover paginated scroll (offset + limit) (#9497)
Add a ScrollPaged verification op that scrolls the (optionally filtered)
collection in pages of a small limit, following next_page_offset until
exhausted. The other scroll ops always read everything in one page
(offset: None, limit: usize::MAX), so the offset cursor and a real
(non-MAX) limit had no coverage.

Asserts each page holds at most `limit` points, no id repeats across
pages, and the union of all pages equals the model's expected id set for
the chosen filter (none / num == X / tag == X). Includes a page-count
guard against a stuck cursor.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-04 11:16:52 +02:00
Roman Titov ce3ea64be8 Fix abort resharding live-lock (#7849) 2026-08-04 11:16:52 +02:00
qdrant-cloud-botandCursor 4207f6875a test(model_testing): cover with_payload/with_vector selectors (#9495)
Add a RetrieveSelective verification op that exercises the
with_payload/with_vector selector forms, which the soak test previously
never used (every read passed Bool only).

- with_payload covers Bool, Fields, Selector::Include, Selector::Exclude.
- with_vector covers both Bool forms and Selector(names) over a subset of
  active vector names.

The verifier asserts the engine's returned payload equals the model entry
filtered by the engine's own PayloadSelector::process, and the returned
vectors equal the requested name subset that the point actually has
populated.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-04 11:16:52 +02:00
qdrant-cloud-botandCursor 6f9f3c8882 test(model_testing): cover SetPayloadOp.key (#9494)
Add a SetPayloadByKey op to the model_testing soak test so the keyed
set-payload path (SetPayloadOp.key) is exercised. Previously every
set-payload op passed key: None, leaving the key-scoped assignment path
(merge_by_key / JsonPath::value_set) uncovered.

The op samples existing point ids, a random payload, and a single
top-level schema field as the key. The model mirrors the engine via
Payload::merge_by_key (the same JsonPath::value_set the engine's
set_by_key uses), keeping model and engine in lockstep.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-04 11:16:52 +02:00
Tim Viséeandcoderabbitai[bot] f82ba0b6d9 Add routing token for deterministic read routes (#9338)
* Add routing token structure

* Implement routing token in read operation executor as per design doc

* Add TODO to glue routing token to user requests

* Implement routing header for REST API

* Source routing token from request, not from JWT token

* Implement routing token in gRPC API

* Add test

* Review remarks

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* Use lower case header name to prevent panic

* Rename header to X-Qdrant-Route-Affinity

* Assert routing consistency in test on all peers

---------

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2026-08-04 11:16:52 +02:00
qdrant-cloud-botandCursor 5bcc420073 test: fix flaky test_partial_snapshot_empty (#9493)
The test asserts that creating a partial snapshot between two in-sync peers
returns 304 (empty diff). It only waited for the write peer to become green,
but read the read peer's manifest for the comparison. An async optimization
reshaping the read peer's segments after collection-snapshot recovery makes
its manifest diverge from the write peer's files, producing 200 instead of
304 (assert 200 == 304).

Wait for the read peer to become green as well before comparing manifests,
mirroring the earlier flaky-test fixes (#7358, #7360).

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-04 11:16:52 +02:00
qdrant-cloud-botanddependabot[bot] 80d378b896 build(deps): bump cryptography from 48.0.0 to 48.0.1 in /tests (#9492)
Bumps [cryptography](https://github.com/pyca/cryptography) from 48.0.0 to 48.0.1.
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/cryptography/compare/48.0.0...48.0.1)

---
updated-dependencies:
- dependency-name: cryptography
  dependency-version: 48.0.1
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-04 11:16:52 +02:00
Daniel BorosandLuis Cossío 08634d0b6d fix: enable disk cache over a network (S3) remote (#9467)
* fix: disk cache maps logical (non-local) remote paths

* feat: derive Clone for BlobFile

* nits

---------

Co-authored-by: Luis Cossío <luis.cossio@outlook.com>
2026-08-04 11:16:52 +02:00
Daniel Boros 5048149be9 fix: read-only on-disk field index opens are non-writeable (#9468) 2026-08-04 11:16:52 +02:00
xzfc bded4c15c3 Move trait ConditionChecker to common (#9486)
* Add DynConditionChecker type alias

* Add DynConditionChecker type alias (point_scorer.rs)

* Move trait ConditionChecker to `common`

Reason: will be used both in `segment` and `sparse` crates.
2026-08-04 11:16:52 +02:00
xzfcandLuis Cossío 211c64608c Sparse InvertedIndex: bring back generic methods (#9485)
* sparse InvertedIndex: bring back generics

* nits

---------

Co-authored-by: Luis Cossío <luis.cossio@outlook.com>
2026-08-04 11:16:52 +02:00
Daniel Boros f126b89d3c fix: BlobFs::list_files honors byte-prefix contract (#9464) 2026-08-04 11:16:52 +02:00
Roman Titov de7bfc9daa Use batched reads in GridstoreView::iter (#9429) 2026-08-04 11:16:52 +02:00
qdrant-cloud-botandCursor fa07065c36 test(model_testing): add dense vector with inline_storage + scalar quantization (#9484)
Add a new named dense vector "i" to the model_testing fixture configured
with HNSW inline_storage backed by scalar quantization, so the soak harness
exercises the inline-storage index layout. It behaves like a normal dense
vector to the model; only the on-disk HNSW layout differs.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-04 11:16:52 +02:00
Ivan Pleshkovandjojii 44a5539084 [TQDT] Wire TQ multivectors storage (#9439)
* multi tq scorers

* add vector storage enum

* Rebase fixes

* Improve scoring

---------

Co-authored-by: jojii <jojii@gmx.net>
2026-08-04 11:16:52 +02:00
qdrant-cloud-botandCursor d7f33cb7d5 test(turbo): reduce randomized scenarios on Windows to fix SLOW tests (#9483)
The 6 turbo vector storage model tests are flagged SLOW by nextest on
Windows CI (>60s, some >240s):
  - vector_storage::turbo::tests::turbo_model_test_random_ops_{dot,cosine}
  - vector_storage::turbo::multi::tests::turbo_multi_model_test_random_ops_{dot,cosine}
  - vector_storage::turbo::test::congruent_random_ops_{dot,cosine}

These are dim x seed x ops sweeps; Windows runners are several times slower.
Lower SEEDS_PER_CELL on Windows only via #[cfg(windows)] so the runs stay
within the slow-timeout, while keeping full coverage on Linux/macOS.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-04 11:16:52 +02:00
qdrant-cloud-botandCursor 3cbb926c0f build(deps): bump pyjwt from 2.12.1 to 2.13.0 in /tests (#9482)
Ports https://github.com/qdrant/qdrant/pull/9480 to dev.

Bumps pyjwt from 2.12.1 to 2.13.0 (security release).

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-04 11:16:52 +02:00
dependabot[bot] d8c9978775 build(deps): bump cc from 1.2.63 to 1.2.64 (#9470)
Bumps [cc](https://github.com/rust-lang/cc-rs) from 1.2.63 to 1.2.64.
- [Release notes](https://github.com/rust-lang/cc-rs/releases)
- [Changelog](https://github.com/rust-lang/cc-rs/blob/main/CHANGELOG.md)
- [Commits](https://github.com/rust-lang/cc-rs/compare/cc-v1.2.63...cc-v1.2.64)

---
updated-dependencies:
- dependency-name: cc
  dependency-version: 1.2.64
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-04 11:16:51 +02:00
dependabot[bot] 270ac06465 build(deps): bump log from 0.4.31 to 0.4.32 (#9472)
Bumps [log](https://github.com/rust-lang/log) from 0.4.31 to 0.4.32.
- [Release notes](https://github.com/rust-lang/log/releases)
- [Changelog](https://github.com/rust-lang/log/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rust-lang/log/compare/0.4.31...0.4.32)

---
updated-dependencies:
- dependency-name: log
  dependency-version: 0.4.32
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-04 11:16:51 +02:00
dependabot[bot] 1fcaacbaa3 build(deps): bump prost from 0.14.3 to 0.14.4 (#9474)
Bumps [prost](https://github.com/tokio-rs/prost) from 0.14.3 to 0.14.4.
- [Release notes](https://github.com/tokio-rs/prost/releases)
- [Changelog](https://github.com/tokio-rs/prost/blob/master/CHANGELOG.md)
- [Commits](https://github.com/tokio-rs/prost/compare/v0.14.3...v0.14.4)

---
updated-dependencies:
- dependency-name: prost
  dependency-version: 0.14.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-04 11:16:51 +02:00
dependabot[bot] 094bc86de7 build(deps): bump chrono from 0.4.44 to 0.4.45 (#9476)
Bumps [chrono](https://github.com/chronotope/chrono) from 0.4.44 to 0.4.45.
- [Release notes](https://github.com/chronotope/chrono/releases)
- [Changelog](https://github.com/chronotope/chrono/blob/main/CHANGELOG.md)
- [Commits](https://github.com/chronotope/chrono/compare/v0.4.44...v0.4.45)

---
updated-dependencies:
- dependency-name: chrono
  dependency-version: 0.4.45
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-04 11:16:51 +02:00
dependabot[bot] f751047cd7 build(deps): bump quick_cache from 0.6.22 to 0.6.23 (#9469)
Bumps [quick_cache](https://github.com/arthurprs/quick-cache) from 0.6.22 to 0.6.23.
- [Release notes](https://github.com/arthurprs/quick-cache/releases)
- [Commits](https://github.com/arthurprs/quick-cache/compare/v0.6.22...v0.6.23)

---
updated-dependencies:
- dependency-name: quick_cache
  dependency-version: 0.6.23
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-04 11:16:51 +02:00
dependabot[bot] b3e55ccf22 build(deps): bump regex from 1.12.3 to 1.12.4 (#9471)
Bumps [regex](https://github.com/rust-lang/regex) from 1.12.3 to 1.12.4.
- [Release notes](https://github.com/rust-lang/regex/releases)
- [Changelog](https://github.com/rust-lang/regex/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rust-lang/regex/compare/1.12.3...1.12.4)

---
updated-dependencies:
- dependency-name: regex
  dependency-version: 1.12.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-04 11:16:51 +02:00
dependabot[bot] 89edc7556c build(deps): bump serde_with from 3.20.0 to 3.21.0 (#9473)
Bumps [serde_with](https://github.com/jonasbb/serde_with) from 3.20.0 to 3.21.0.
- [Release notes](https://github.com/jonasbb/serde_with/releases)
- [Commits](https://github.com/jonasbb/serde_with/compare/v3.20.0...v3.21.0)

---
updated-dependencies:
- dependency-name: serde_with
  dependency-version: 3.21.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-04 11:16:51 +02:00
dependabot[bot] 267f07f8cf build(deps): bump uuid from 1.23.2 to 1.23.3 (#9475)
Bumps [uuid](https://github.com/uuid-rs/uuid) from 1.23.2 to 1.23.3.
- [Release notes](https://github.com/uuid-rs/uuid/releases)
- [Commits](https://github.com/uuid-rs/uuid/compare/v1.23.2...v1.23.3)

---
updated-dependencies:
- dependency-name: uuid
  dependency-version: 1.23.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-04 11:16:51 +02:00
dependabot[bot] 38e7d1dbaa build(deps): bump zerocopy from 0.8.50 to 0.8.52 (#9478)
Bumps [zerocopy](https://github.com/google/zerocopy) from 0.8.50 to 0.8.52.
- [Release notes](https://github.com/google/zerocopy/releases)
- [Commits](https://github.com/google/zerocopy/compare/v0.8.50...v0.8.52)

---
updated-dependencies:
- dependency-name: zerocopy
  dependency-version: 0.8.52
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-04 11:16:51 +02:00
dependabot[bot] 9a68044f9d build(deps): bump http from 1.4.1 to 1.4.2 (#9477)
Bumps [http](https://github.com/hyperium/http) from 1.4.1 to 1.4.2.
- [Release notes](https://github.com/hyperium/http/releases)
- [Changelog](https://github.com/hyperium/http/blob/master/CHANGELOG.md)
- [Commits](https://github.com/hyperium/http/compare/v1.4.1...v1.4.2)

---
updated-dependencies:
- dependency-name: http
  dependency-version: 1.4.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-04 11:16:51 +02:00
Daniel Boros baf9b4ae2f refactor: explicit index-type arms for Turbo4 in read-only open (#9479) 2026-08-04 11:16:51 +02:00
cc8d5d25fa feat: add open for read-only sparse vector index (#9435)
* feat: add open for read-only sparse vector index + enum sparse dispatcher

* fix: universal-IO loads for read-only sparse index open

* refactor: rename load_via/open_via to load_universal/open_universal

* refactor: drop StorageVersion::load in favor of load_universal

The regular-IO `load` duplicated `load_universal` over plain `File` IO.
Remove it and route all callers through `load_universal(&MmapFs, ..)`.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* refactor(sparse): decouple inverted index from concrete storage; split segment_constructor_base (#9461)

Make the read-only index enum generic over storage `S` (no concrete MmapFile),
and remove construction callbacks from the sparse index open paths.

- InvertedIndex is now a pure read/search trait: `open`/`from_ram_index`/
  `type Fs` moved off the trait to inherent methods on each concrete index
  type, so construction no longer requires `S::Fs: Default`.
- SparseVectorIndex open split into a generic `plan` (load-vs-build decision +
  RAM-index build) and generic `finish` (assembly); callers do the concrete
  per-type construction, so no construction callbacks are needed.
- ReadOnlySparseVectorIndex::open takes the already-constructed inverted index
  and caller-loaded config instead of a `load_inverted_index` callback.
- VectorIndexReadEnum is generic over `S: UniversalRead`; sparse mmap variants
  hold `InvertedIndexCompressedMmap<_, S>` rather than a concrete `MmapFile`.
- Split the 1182-line segment_constructor_base.rs into a module (paths,
  vector_storage, payload_storage, id_tracker, vector_index,
  sparse_vector_index, create_segment, segment, legacy_state); the sparse
  dispatcher's match arms collapse into three per-family helpers.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>

* feat: LiveReload (no-op) dispatch for read-only vector index enum (#9436)

---------

Co-authored-by: generall <andrey@vasnetsov.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-04 11:16:51 +02:00
Daniel BorosandLuis Cossío 35c17c8fa0 feat: live_reload for read-only immutable id tracker + enum dispatch (#9434)
* feat: live_reload for read-only immutable id tracker + enum dispatch

* deleted should be already sorted

---------

Co-authored-by: Luis Cossío <luis.cossio@outlook.com>
2026-08-04 11:16:51 +02:00
xzfc 0405bb5057 [UIO] condition checker: fallible checks (#9405)
* condition checker: fallible checks

* Update
2026-08-04 11:16:51 +02:00
Daniel BorosandLuis Cossío 10e91166cf feat: add VectorIndexReadEnum open dispatcher (#9428)
* feat: add VectorIndexReadEnum open dispatcher

* review nit

---------

Co-authored-by: Luis Cossío <luis.cossio@outlook.com>
2026-08-04 11:16:51 +02:00
Luis Cossío 02eba0ac5a Add facets bench (#9456) 2026-08-04 11:16:51 +02:00
qdrant-cloud-botanddependabot[bot] 344447d4b8 build(deps): bump pyo3 from 0.28.3 to 0.29.0 (#9462)
Bumps [pyo3](https://github.com/pyo3/pyo3) from 0.28.3 to 0.29.0.
- [Release notes](https://github.com/pyo3/pyo3/releases)
- [Changelog](https://github.com/PyO3/pyo3/blob/main/CHANGELOG.md)
- [Commits](https://github.com/pyo3/pyo3/compare/v0.28.3...v0.29.0)

---
updated-dependencies:
- dependency-name: pyo3
  dependency-version: 0.29.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-04 11:16:51 +02:00
17958c9cad feat: add open to read-only HNSW index (#9427)
* feat: add open to read-only HNSW index

* fix: dedicated universal-IO load for read-only graph

* fix: report actual graph residency in read-only is_on_disk

* refactor: rename load_via to load_universal

* refactor: unify graph links loading on universal IO

Replace the dual GraphLinks load paths (regular mmap + universal IO) with a
single universal-IO loader, and the `Mmap` GraphLinksEnum variant with a
`Universal` variant that keeps a type-erased `UniversalRead` handle alive
behind `Box<dyn GraphLinksStorage>` (UniversalRead is not object-safe).

- GraphLinksEnum::from_storage picks the variant from UniversalKind:
  borrowable (mmap-backed) kinds stay `Universal`, others are materialized
  into `Ram`, so the borrowability invariant in GraphLinksStorage::bytes
  holds by construction.
- Loading takes a `Populate` parameter, derived from `hnsw_config.on_disk`:
  on_disk -> Populate::No (lazy), otherwise Populate::Blocking.
- is_on_disk is reported from config again instead of the enum variant.
- Split graph_links.rs into a graph_links/ module (format, vectors, storage,
  links, tests) with a relationship diagram in mod.rs.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* refactor: drop LoadOption in favor of a Populate parameter

After unifying the link load paths on universal IO, LoadOption only encoded a
populate choice with a fs that was always MmapFs. Replace it with a `Populate`
argument to GraphLayers::load, removing the enum, its constructors, the
load_links helper, and the unused generic backend.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: generall <andrey@vasnetsov.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-04 11:16:51 +02:00
Ivan Pleshkov ad5b5b4229 unpadded rotations (#9450) 2026-08-04 11:16:51 +02:00
qdrant-cloud-botandCursor 3841b3c841 Lower default update queue length from 1M to 200 (#9448)
Reduce the default in-RAM update worker queue size to limit memory
held by pending operations and provide faster backpressure.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-04 11:16:51 +02:00
Jojii 27b5b6f369 [TQDT] TurboMultiVectorStorage (#9414)
* TurboQuant Datatype for Multivectors

* Fix update_from and add non-appendable open()

* Fix unnecessary allocations + wrap chunk boundaries

* Congruence tests TurboVectorStorage <-> TurboMultiVectorStorage(vecs=1)

* Only use appendable backend for turbo4-multivectors

* Simplify update_from

* Never place multivectors across chunk boundaries (skip tail, reject oversized)

* Review remarks
2026-08-04 11:16:51 +02:00
Daniel Boros 14b68ca2a5 feat: read-only immutable id tracker open + enum open dispatcher (#9433) 2026-08-04 11:16:51 +02:00
Daniel Boros 7eb6194f8f feat: add open to read-only plain vector index (#9426) 2026-08-04 11:16:51 +02:00