Skip to content

fix: Scope feature view name conflict check to current project in file-based registry#6369

Merged
ntkathole merged 6 commits into
feast-dev:masterfrom
Abhishek8108:fix/cross-project-feature-view-name-conflict
May 6, 2026
Merged

fix: Scope feature view name conflict check to current project in file-based registry#6369
ntkathole merged 6 commits into
feast-dev:masterfrom
Abhishek8108:fix/cross-project-feature-view-name-conflict

Conversation

@Abhishek8108

@Abhishek8108 Abhishek8108 commented May 5, 2026

Copy link
Copy Markdown
Contributor

What this PR does

Fixes #6209.

_check_conflicting_feature_view_names built its lookup map from all feature views in cached_registry_proto without filtering by project. In a shared file-based registry with multiple projects, this caused false ConflictingFeatureViewNames errors when two different projects defined feature views with the same name.

Root cause

_existing_feature_view_names_to_fvs iterated over all three collections (feature views, stream feature views, on-demand feature views) in the entire RegistryProto without scoping to the current project. The dict is keyed by name only, so a FeatureView named driver_stats in project_a and a FeatureView also named driver_stats in project_b would collide, triggering a spurious error on the second feast apply.

Fix

  • Added a project: str parameter to both _check_conflicting_feature_view_names and _existing_feature_view_names_to_fvs
  • Each collection is now filtered by fv.spec.project == project so only feature views belonging to the current project are included in the conflict map
  • The call site in apply_feature_view passes the project argument that is already in scope

Tests

  • Added test_cross_project_feature_view_names_do_not_conflict in tests/unit/local_feast_tests/test_local_feature_store.py: two FeatureStore instances sharing a registry file but different projects both apply a FeatureView named driver_stats — asserts no ConflictingFeatureViewNames is raised
  • Existing test_apply_conflicting_feature_view_names continues to pass — same-project type conflicts are still detected correctly

@Abhishek8108 Abhishek8108 requested a review from a team as a code owner May 5, 2026 21:24
@Abhishek8108 Abhishek8108 changed the title fix: scope feature view name conflict check to current project in file-based registry fix: Scope feature view name conflict check to current project in file-based registry May 5, 2026
@Abhishek8108

Abhishek8108 commented May 5, 2026

Copy link
Copy Markdown
Contributor Author

Hi — wanted to flag that the remaining CI failure is on the unit-test-python (3.12, macos-14) job and appears to be a runner environment issue unrelated to this PR.

The root cause visible in the job logs is a psutil version conflict on the macOS runner:

ImportError: version conflict:
'.venv/lib/python3.12/site-packages/psutil/_psutil_osx.abi3.so'
C extension module was built for another version of psutil (5.9.8 instead of 5.9.0)

Because the feast CLI subprocess cannot even complete its import, every test that spawns a CLI subprocess exits immediately with code -1 and empty stdout. This explains all three failures:

  • test_cli_apply_imported_featureview — expects exit 0, gets -1
  • test_cli_apply_duplicated_featureview_names — expects the error message in output, gets empty bytes
  • test_milvus_retrieve_online_documents_v2_missing_entity_key — unrelated Milvus internal error on the same runner

None of these tests are in files changed by this PR, and the same macOS 3.12 job passes on master. The Ubuntu jobs (3.10, 3.11, 3.12) and macOS 3.11 all pass cleanly.

Would you be able to re-trigger the macOS 3.12 job, or confirm you're happy to merge with the understanding that this failure is a transient runner issue? Happy to do anything else needed on my end — thank you for your time!

…e-based registry

_check_conflicting_feature_view_names built its lookup map from all
feature views in cached_registry_proto without filtering by project.
In a shared file-based registry with multiple projects, this caused
false ConflictingFeatureViewNames errors when two different projects
defined feature views with the same name.

Add a project parameter to both _check_conflicting_feature_view_names
and _existing_feature_view_names_to_fvs, and filter each collection
by fv.spec.project == project so only same-project views are compared.

Fixes feast-dev#6209

Signed-off-by: Abhishek8108 <87538407+Abhishek8108@users.noreply.github.com>
…anifest

The placeholder value your-marquez-api-key in openlineage-secret_v1_secret.yaml
triggers detect-secrets. Mark it as an allowlist exception.

Signed-off-by: Abhishek8108 <87538407+Abhishek8108@users.noreply.github.com>
FileSource requires the file to exist when apply() succeeds (no early
exception). Replace the bare path string with a mkstemp() path so the
test passes in CI.

Signed-off-by: Abhishek8108 <87538407+Abhishek8108@users.noreply.github.com>
…oject test

apply() reads the parquet schema when the apply succeeds (no early
exception). Use the prep_file_source() helper — the same pattern all
other tests that call apply() use — to produce a real, schema-valid
parquet file instead of an empty temp file.

Signed-off-by: Abhishek8108 <87538407+Abhishek8108@users.noreply.github.com>
Replace the FeatureStore-level test (which fought parquet inference and
dill source extraction) with a direct Registry-level test mirroring the
pattern in test_sql_registry.py.

Two tests in tests/unit/infra/registry/test_file_registry.py:
- test_same_project_name_conflict_batch_vs_stream: confirms that a
  FeatureView and StreamFeatureView with the same name in the same
  project still raise ConflictingFeatureViewNames (existing behaviour)
- test_cross_project_name_does_not_conflict_batch_vs_stream: confirms
  that the same name across different projects and different view types
  no longer raises (the bug fixed by this PR)

Signed-off-by: Abhishek8108 <87538407+Abhishek8108@users.noreply.github.com>
Signed-off-by: Abhishek8108 <87538407+Abhishek8108@users.noreply.github.com>
@ntkathole ntkathole force-pushed the fix/cross-project-feature-view-name-conflict branch from 75cf87c to e9b2e81 Compare May 6, 2026 04:28

@ntkathole ntkathole left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm

@ntkathole ntkathole merged commit a4fde83 into feast-dev:master May 6, 2026
36 of 40 checks passed
franciscojavierarceo pushed a commit that referenced this pull request Jun 13, 2026
# [0.64.0](v0.63.0...v0.64.0) (2026-06-13)

### Bug Fixes

* Add async_supported property to RedisOnlineStore ([9b088fe](9b088fe))
* Add missing feast init templates to operator CRD and enhance persistence documentation ([1941d4d](1941d4d))
* Allow to publish from reference branch ([5458ec8](5458ec8))
* API calls list ([4203eb7](4203eb7))
* **bigquery:** Enable list inference for parquet loads in offline_write_batch ([9243497](9243497)), closes [#5845](#5845)
* Bump grpcio dependencies ([07b4782](07b4782))
* **compute-engine/local:** Honor field_mapping on join keys in dedup + join nodes ([#6395](#6395)) ([bd01824](bd01824))
* **dynamodb:** Avoid tag race condition by using diff-based tag updates ([#6479](#6479)) ([bad2b7d](bad2b7d)), closes [#6418](#6418)
* **dynamodb:** Fix mypy type for _build_projection_expression return ([217b4da](217b4da))
* Fix intermittent async test failures for DynamoDB and Redis ([63c5eb1](63c5eb1))
* Fix mongodb blog title ([57d28d4](57d28d4))
* Fix shared SQL registry crash - avoid unnecessary UDF deserialization in proto cache building ([ac588d7](ac588d7))
* Fix SparkRetrievalJob.persist() failing for SparkSource ([209d7cd](209d7cd))
* Fixed formatting and image for mongo blog ([#6377](#6377)) ([f8389fb](f8389fb))
* Fixes for ray source ([7f592a4](7f592a4))
* **go:** skip registry refresh when cache_ttl_seconds <= 0 ([97ed40c](97ed40c))
* Handle array of strings columns in Athena materialization ([#6324](#6324)) ([4ed0278](4ed0278))
* make milvus VARCHAR max_length configurable, remove hardcoded 512 limit ([3b98c22](3b98c22))
* **operator:** Set appProtocol: grpc on registry gRPC Service ([#6367](#6367)) ([c9ae2b4](c9ae2b4))
* PyJWT 2.10+ added validation that rejects empty HMAC keys ([e756ffe](e756ffe))
* RemoteOnlineStore sends all features in a single HTTP request ([8f187dd](8f187dd))
* Remove registry proto dump to enforce RBAC and add permission checks to Commit/Refresh RPCs ([328431f](328431f))
* Remove selector migration job - no longer needed ([51c325e](51c325e))
* replace broken .claude skill symlink with correct relative path ([4541690](4541690))
* Replace selector label strip patch with migration Job for upgrade-safe selector uniqueness ([00dea50](00dea50))
* Scope feature view name conflict check to current project in file-based registry ([#6369](#6369)) ([a4fde83](a4fde83)), closes [#6209](#6209)
* **snowflake:** Stop double-quoting connection identifiers ([#6462](#6462)) ([e914d59](e914d59))
* **spark:** S3/GCS PyArrow filesystem resolution for staging paths ([#6442](#6442)) ([ae50414](ae50414))
* **trino:** Clean up temporary entity tables after retrieval ([#6381](#6381)) ([d86b13d](d86b13d)), closes [#6306](#6306)
* Update go-feature-server base image to Go 1.25 and fix operator Dockerfile COPY permissions ([86ef0bc](86ef0bc))

### Features

* [Backend] Data Quality Monitoring with native compute, multi-backend support, REST API, CLI ([#6202](#6202)) ([5458c37](5458c37))
* Add apache flink compute engine ([#6476](#6476)) ([9636d6a](9636d6a))
* Add demo noteboooks for users ([e362173](e362173))
* Add enabled/disabled toggle for feature views ([#6401](#6401)) ([5f1fa0d](5f1fa0d)), closes [#6395](#6395)
* Add Label View to init template ([ec272d5](ec272d5))
* Add mTLS support to remote registry gRPC client ([#6474](#6474)) ([c9602d8](c9602d8))
* Add Prometheus gauges for FeatureStore installation telemetry ([#6354](#6354)) ([1b681b7](1b681b7))
* Adds registry REST API endpoints for managing entities, data sources, and feature views ([#6413](#6413)) ([f77bd1d](f77bd1d))
* Allow CRUD on entities, data sources, and feature views from UI ([#6412](#6412)) ([2321c07](2321c07))
* Allow default openlineage configuration ([#6467](#6467)) ([276b6df](276b6df))
* **bigquery:** Support DATE-type event timestamp columns ([#6362](#6362)) ([753dee5](753dee5)), closes [#2530](#2530)
* **cli:** Add `feast projects delete` command (closes [#5095](#5095)) ([#6318](#6318)) ([1a4b96c](1a4b96c))
* Data Quality Monitoring added in feast UI ([#6422](#6422)) ([fa271be](fa271be))
* **dynamodb:** Use ProjectionExpression when requested_features is set ([0adc906](0adc906)), closes [#6058](#6058)
* Enhance DataSource and FeatureView modals with error handling and submission states ([96d7169](96d7169))
* Expose registry endpoints on feature server for MCP access ([f77981c](f77981c))
* Feast First-Class LabelView Implementation ([#6292](#6292)) ([c0e7e5d](c0e7e5d))
* Feast-MLflow Integration ([#6235](#6235)) ([7279c75](7279c75))
* Operational metrics for offline store and SOX metrics for both ([#6340](#6340)) ([65b1b80](65b1b80))
* Pre-compute feature service ([8011550](8011550))
* REST API-backed UI for RBAC compatibility and per-page lazy loading ([#6414](#6414)) ([6ae80af](6ae80af))
* Support non-string map key types ([#6382](#6382)) ([#6383](#6383)) ([728aa2e](728aa2e))
* Update FeatureStore CRD with DRA Fields ([01241e4](01241e4))

### Performance Improvements

* Cache feature view resolution in get_online_features to reduce per-request overhead ([55c2f18](55c2f18))
* Optimize feature serving latency with batched async Redis, cached checks fix ([103809a](103809a))
* Replace MessageToDict with optimized custom dict builder ([#6015](#6015)) ([9902064](9902064))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

check_conflicting_feature_view_names falsely flags cross-project name conflicts in shared registries

2 participants