Skip to content

fix: Make Milvus placeholder vectors valid on Milvus servers - #6881

Closed
simonhearne wants to merge 1 commit into
feast-dev:masterfrom
simonhearne:fix/milvus-placeholder-vector
Closed

simonhearne wants to merge 1 commit into
feast-dev:masterfrom
simonhearne:fix/milvus-placeholder-vector

Conversation

@simonhearne

Copy link
Copy Markdown
Contributor

What this PR does / why we need it:

Milvus needs a vector field in every collection, so feature views without one get a
_placeholder_vector. It was 1-dimensional, filled with NaN and not indexed. Milvus Lite accepts
all of that, but Milvus servers and Zilliz Cloud do not:

  • create_collection fails: invalid dimension: 1. should be in range 2 ~ 32768
  • upsert fails: value 'NaN' is not a number or infinity
  • load_collection fails: index not found

So feature views without vectors couldn't be used with a Milvus server. This PR:

  • makes the placeholder 2-dimensional, zero-filled and FLAT-indexed;
  • indexes vector fields that don't have vector_index=True (FLAT), so collections can load;
  • fills the placeholder to the dimension recorded in the collection, so existing Milvus Lite
    collections with a 1-dim placeholder keep working;
  • fixes the docs page, which was titled "Redis online store" and had a stray connection_string.

Milvus 2.6.0 and Milvus Lite 3.2.1 both reject collections without a vector field
(schema does not contain vector field), so the placeholder can't be removed.

Which issue(s) this PR fixes:

N/A

Checks

  • I've made sure the tests are passing.
  • My commits are signed off (git commit -s)
  • My PR title follows conventional commits format

Testing Strategy

  • Unit tests

  • Integration tests

  • Manual tests

  • Testing is not required for this change

  • Unit (Milvus Lite): round trip for a feature view without vectors.

  • Unit (mocked client): placeholder dim ≥ 2 and indexed; placeholder values match a legacy 1-dim collection.

  • Server: round trip for a feature view without vectors. Fails on master with the error above.

Unit tests run on Milvus Lite 3.2.1 (pymilvus 3.0.2). Server tests in sdk/python/tests/integration/online_store/test_milvus_remote.py are marked integration and skip unless ZILLIZ_URI and ZILLIZ_TOKEN are set; they passed against a local Milvus 2.6.0 server and against Zilliz Cloud. The existing Milvus unit and universal integration tests pass unchanged.

Misc

Part of a series of Milvus online store improvements for Zilliz Cloud and production Milvus.

🤖 Generated with Claude Code

@codecov-commenter

codecov-commenter commented Sep 28, 2026 •

Copy link
Copy Markdown

⚠️ Please install the 'codecov app svg image' to ensure uploads and comments are reliably processed by Codecov.

Codecov Report

❌ Patch coverage is 90.00000% with 1 line in your changes missing coverage. Please review.
✅ Project coverage is 47.87%. Comparing base (213a130) to head (6b93ce9).
⚠️ Report is 6 commits behind head on master.

Files with missing lines Patch % Lines
.../infra/online_stores/milvus_online_store/milvus.py 90.00% 0 Missing and 1 partial ⚠️
❗ Your organization needs to install the Codecov GitHub app to enable full functionality.
Additional details and impacted files

Impacted file tree graph

@@            Coverage Diff             @@
##           master    #6881      +/-   ##
==========================================
+ Coverage   47.86%   47.87%   +0.01%     
==========================================
  Files         422      422              
  Lines       52408    52414       +6     
  Branches     7607     7608       +1     
==========================================
+ Hits        25084    25094      +10     
+ Misses      25512    25509       -3     
+ Partials     1812     1811       -1     
Flag Coverage Δ
go-feature-server 30.58% <ø> (ø)
python-unit 49.23% <90.00%> (+0.01%) ⬆️
Files with missing lines Coverage Δ
.../infra/online_stores/milvus_online_store/milvus.py 70.11% <90.00%> (+1.31%) ⬆️

Continue to review full report in Codecov by Harness.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 213a130...6b93ce9. Read the comment docs.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

Feature views without a vector field get a placeholder vector because
Milvus requires one per collection. The placeholder was 1-dimensional,
filled with NaN and left unindexed. Milvus Lite accepts all three, but
Milvus servers and Zilliz Cloud reject dim < 2 and non-finite values,
and refuse to load a collection with an unindexed vector field, so
these feature views could not be created or read.

The placeholder is now 2-dimensional, zero-filled and FLAT-indexed.
Vector fields without vector_index=True also get a FLAT index so the
collection can be loaded. Existing collections keep working because
the placeholder is filled to the dimension recorded in the collection.

Also fixes the Milvus docs page title and example config.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Simon Hearne <simon.hearne@gmail.com>
@simonhearne
simonhearne force-pushed the fix/milvus-placeholder-vector branch from c93b627 to 6b93ce9 Compare September 28, 2026 14:34
@ntkathole

Copy link
Copy Markdown
Member

merged second one

@ntkathole ntkathole closed this Sep 29, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants