Handles held across delete and recreate resurrect records in QdrantVectorStore #1563
Copy link
Copy link
Open
Labels
horizontal scalingWrong or unsafe when more than one server process serves the same backends (replicas or workers)Wrong or unsafe when more than one server process serves the same backends (replicas or workers)
Description
Activity
- linked a pull request that will close this issue[vector store scale-out] Mint an incarnation per collection life in a SQL-arbitrated registry, so any process may serve any Qdrant or Milvus collection #1631
on Sep 29, 2026 - addedhorizontal scalingWrong or unsafe when more than one server process serves the same backends (replicas or workers)Wrong or unsafe when more than one server process serves the same backends (replicas or workers)
on Sep 29, 2026 Fixed by #1734 and #1735: a handle is bound to the incarnation of the collection life it was opened on, so after a delete and recreate it raises instead of writing into the successor. Close when the chain merges.
🤖 Written by Claude Code (Claude Fable 5.1) on behalf of @edwinyyyu.
- added 8 commits that reference this issue
on Oct 5, 2026
Metadata
Metadata
Assignees
Labels
horizontal scalingWrong or unsafe when more than one server process serves the same backends (replicas or workers)Wrong or unsafe when more than one server process serves the same backends (replicas or workers)
Status 2026-10-02. Fixed by #1734 and #1735: a handle is bound to the incarnation of the collection life it was opened on, so after a delete and recreate it raises instead of writing into the successor; closes on merge. The SQLite stores' equivalent stays open as #1536.
What happened
A
VectorStoreCollectionhandle stays usable after its collection is deleted, and its writes reach the collection that replaces it.QdrantVectorStoreuses the logical name directly as the tenant discriminator, with nothing distinguishing one incarnation of a name from the next:So: open a collection, hold the handle, delete the collection, create one with the same
(namespace, name), then write through the old handle. The record carries the same partition key the new collection reads, and is returned by its queries.This needs no concurrency to reproduce — a purely sequential create / open / delete / create / write sequence is enough.
Expected
A handle is invalid once its collection is deleted, and a write through one must never become visible in a collection later created with the same namespace and name.
Fix
Give each creation a fresh incarnation and make the partition key carry it, so records written through a stale handle land under a value nothing resolves to. #1527 does this.
Notes
Same defect class as #1536, which covers both SQLite-backed vector stores. This is the Qdrant instance of it. #1531 states the invariant as a
VectorStoreCollectioncontract.