github milvus-io/milvus v3.0.2
milvus-3.0.2

latest releases: v2.6.25, pkg/v2.6.25
15 days ago

v3.0.2

Release date: September 20, 2026

Milvus Version Python SDK Version Node.js SDK Version Java SDK Version Go SDK Version
3.0.2 3.0.2 3.0.6 3.0.10 3.0.2

We are excited to announce the release of Milvus v3.0.2! This release focuses on search and query performance — removing hot-path contention in filtered search, group-by, and index building — along with stronger external collection and Storage V2 support, and a broad set of stability fixes across streaming, compaction, and index management.

Improvements

  • Optimized ARRAY filtering by merging chained contains predicates into a single ContainsAny/ContainsAll expression in the query planner (#52365)
  • Added support for custom S3-compatible endpoints in external collections via the extfs.endpoint_url option, with validation of unsafe or conflicting endpoint settings (#52814)
  • Unified Bloom and Roaring membership filters behind a single membership_match expression, with matching Go client support for building and querying both filter types (#53019)
  • Reduced write amplification during Tantivy-based index building, lowering disk I/O for text match, NGRAM, and JSON key stats indexes (#53057)
  • Added admission control on RESTful v2 DQL endpoints that returns HTTP 429 with Retry-After before request decoding when the proxy query queue is full (#53111)
  • Reduced an atomic refcount hotspot in the scalar filter evaluation path that accounted for ~48% of leaf CPU time in search, improving filtered search throughput (#53167)
  • Improved storage thread pool scalability by replacing the hand-rolled implementation with folly::CPUThreadPoolExecutor and restoring elastic worker scaling (#53184)
  • Improved REST access log matching so formatters are matched against the parsed URL path, and configured methods now apply to requests carrying query parameters (#53147)
  • Added idempotent broadcast support so retried requests no longer create duplicate tasks, with BulkImport as the first adopter (#53228)
  • Added configurable sentence split characters for the Lindera tokenizer, allowing user dictionary entries containing punctuation to match as a single token (#53287)
  • Added a cluster-version gate that automatically enables write-before function materialization only after all nodes finish upgrading, avoiding mixed-version inconsistency during rolling upgrades (#53261)
  • Upgraded Woodpecker to v0.1.42, fixing WAL recovery failures on finalized empty segments and improving append-path stability and metrics (#53295)
  • Reduced per-chunk atomic and reference-count overhead in the search and query hot path by pinning a sealed segment snapshot once per request (#53301)
  • Improved partial update latency by replacing TimeTick waits with snapshot-based optimistic locking, and refined AutoID handling so existing primary keys are preserved and returned IDs keep the input order (#53337)
  • Reduced redundant row-view construction when grouping search results by VARCHAR or JSON fields on sealed segments, lowering group-by search overhead (#53500)
  • Added a compliance API that reports load configuration convergence globally and per resource group, covering replica serviceability, query visibility, residual resources and WAL placement (#53517)

Bug fixes

  • Fixed an issue where queries could return incorrect results after a struct array field was dropped and re-added (#52921)
  • Fixed SASL/SCRAM-SHA-256 authentication failures when connecting to Apache Kafka 4.x brokers by upgrading librdkafka to 2.6.1 (#53086)
  • Fixed an issue where all channels of a replica were assigned to a single query node, causing repeated out-of-memory kills and leaving the replica unserviceable (#53094)
  • Fixed repeated WAL fencing that stalled writes on a PChannel for 45-60 seconds every few minutes under sustained ingest (#53118)
  • Fixed Storage V2 compaction dropping valid physical group paths, which could misalign packed column indexes in compacted segments (#53202)
  • Fixed compaction logs printing collection encryption keys and object storage credentials (#53226)
  • Fixed stale struct array offset aliases that could surface incorrect data after a sealed segment was reopened (#53154)
  • Fixed file resource synchronization running before any resource was added, which could clear node-local files on startup or node registration (#53170)
  • Fixed an issue where an incomplete binlog chunk could be silently treated as fully read, risking missing data in query and compaction results (#53263)
  • Fixed an issue where storage of dropped segments was never reclaimed for collections without any active index (#53252)
  • Fixed inaccurate resource estimation when loading sparse vector indexes, which could lead to incorrect raw-data handling and repeated warnings on QueryNode (#53249)
  • Fixed an issue where a frozen streaming node outside the primary resource group could be unfrozen unexpectedly during rebalancing (#53229)
  • Fixed a failure to connect to Google Cloud Storage where GCP credentials (IAM and HMAC) were not registered before the chunk manager pre-check (#53288)
  • Fixed an issue where C++ logs were unexpectedly written to the /tmp directory instead of being forwarded to the unified log output (#53293)
  • Fixed backfill commits failing with an HTTP 500 error when a Spark result spanned multiple partitions (#53346)
  • Fixed a memory leak in DataNode where a canceled index-build or analyze task never released the native memory of the object it had already built (#53348)
  • Fixed an issue where binlog import failed when a nullable vector field had no binlog files (#53363)
  • Fixed incomplete or incorrect output fields when search and query requests read external table data (#53372, #53385)
  • Fixed duplicated sparse-vector rows and partition IDs in REST requests, plus memory ownership and cleanup issues that could cause crashes or leaks when queries exited early (#53402)
  • Fixed an issue where a compaction reporting completion without a result payload could crash DataCoord or leave the compaction task stuck instead of being cleanly retried (#53443)
  • Fixed an issue where properties of external data files were dropped when building segment manifests, causing external collections to lose source file metadata (#53444)
  • Fixed a QueryNode crash that could occur when handling count(*) requests at debug log level, notably during rolling upgrades (#53474)
  • Fixed an issue where index and stats build tasks kept consuming worker resources after their segment, index, or collection had been dropped, and improved cleanup of orphaned index files (#53515)
  • Fixed local storage path handling so that data written by different components always lands where readers and garbage collection expect it, with automatic upgrade for existing local deployments (#53530)
  • Fixed index build tasks retrying forever when a segment contained malformed JSON documents; such builds now fail fast instead of consuming worker resources indefinitely (#53531)
  • Fixed concurrent snapshot restores targeting the same collection: restores are now serialized and a restore to an existing target is rejected with a clear "already exists in database" error instead of racing or leaking resources (#53586)
  • Fixed binary encryption keys being corrupted across storage interfaces and misaligned cursors in projected Storage V2 packed readers by upgrading milvus-storage (#53569)

Don't miss a new milvus release

NewReleases is sending notifications on new releases.