Skip to content

feat: Add feature view versioning support to Redis and DynamoDB online stores#6257

Merged
ntkathole merged 6 commits into
feast-dev:masterfrom
YassinNouh21:feat/redis-dynamodb-versioning
Apr 13, 2026
Merged

feat: Add feature view versioning support to Redis and DynamoDB online stores#6257
ntkathole merged 6 commits into
feast-dev:masterfrom
YassinNouh21:feat/redis-dynamodb-versioning

Conversation

@YassinNouh21
Copy link
Copy Markdown
Collaborator

@YassinNouh21 YassinNouh21 commented Apr 10, 2026

Summary

  • Redis: Adds _versioned_fv_name() helper that computes versioned feature view names (e.g., driver_stats_v2) used in Redis hash field keys (_ts: prefix and mmh3 feature hashes). This ensures version isolation within the same entity hash key — the Redis key itself (entity-based) does not change, only the hash field namespace.
  • DynamoDB: Modifies _get_table_name() to apply a version suffix before template formatting, so each version gets its own DynamoDB table (e.g., project.driver_stats_v2).
  • Both stores are registered in _check_versioned_read_support() and the error message in errors.py is updated.
  • Follows the established versioning pattern from SQLite (feat: Add version tracking to FeatureView #6101), PostgreSQL/MySQL (feat: Add feature view versioning support to PostgreSQL and MySQL online stores #6193).

Changes

File Change
sdk/python/feast/infra/online_stores/redis.py Add _versioned_fv_name(), update delete_table, online_write_batch, online_read, online_read_async, _generate_hset_keys_for_features
sdk/python/feast/infra/online_stores/dynamodb.py Modify _get_table_name() to apply version suffix
sdk/python/feast/infra/online_stores/online_store.py Add Redis and DynamoDB to _check_versioned_read_support()
sdk/python/feast/errors.py Update supported stores list in error message
tests/unit/.../test_redis_versioning.py 11 unit tests for _versioned_fv_name, hset key isolation, read support
tests/unit/.../test_dynamodb_versioning.py 9 unit tests for _get_table_name with versioning, templates, read support
tests/integration/.../test_redis_versioning.py 6 integration tests with real Redis (testcontainers)
tests/integration/.../test_dynamodb_versioning.py 6 integration tests with moto mock DynamoDB

Test plan

  • 20 unit tests pass (test_redis_versioning.py, test_dynamodb_versioning.py)
  • 6 Redis integration tests pass (real Redis via testcontainers)
  • 6 DynamoDB integration tests pass (moto mock)
  • Version isolation verified: data written under v1 is not returned when reading v2
  • projection.version_tag correctly routes reads to the right version
  • ruff check and ruff format --check pass on all changed files

Closes #6164, closes #6163


Open with Devin

…e stores

Redis: Add _versioned_fv_name() helper that computes versioned feature view
names (e.g. driver_stats_v2) used in hash field keys (_ts: and mmh3 feature
hashes). This ensures version isolation within the same entity hash key.

DynamoDB: Modify _get_table_name() to apply version suffix before template
formatting, so each version gets its own DynamoDB table.

Both stores are registered in _check_versioned_read_support() and the error
message is updated accordingly.

Closes feast-dev#6164, closes feast-dev#6163

Signed-off-by: yassinnouh21 <[email protected]>
@YassinNouh21 YassinNouh21 requested review from a team as code owners April 10, 2026 11:25
@YassinNouh21 YassinNouh21 requested review from dmartinol, ejscribner and robhowley and removed request for a team April 10, 2026 11:25
Copy link
Copy Markdown
Contributor

@devin-ai-integration devin-ai-integration Bot left a comment

Choose a reason for hiding this comment

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

✅ Devin Review: No Issues Found

Devin Review analyzed this PR and found no potential bugs to report.

View in Devin Review to see 4 additional findings.

Open in Devin Review

@YassinNouh21 YassinNouh21 requested review from ntkathole and removed request for dmartinol, ejscribner and robhowley April 10, 2026 12:52
@YassinNouh21 YassinNouh21 self-assigned this Apr 10, 2026
Comment thread sdk/python/feast/infra/online_stores/redis.py
Comment thread sdk/python/feast/infra/online_stores/dynamodb.py
…sioning gate

Redis and DynamoDB modules raise FeastExtrasDependencyImportError (not
ImportError) when their dependencies are missing. Use broad Exception
catch so environments without redis/boto3 don't break.

Signed-off-by: yassinnouh21 <[email protected]>
Move version resolution logic into a shared compute_versioned_name()
in helpers.py, reused by Redis, DynamoDB, and compute_table_id().
Addresses reviewer feedback to avoid duplicating version logic.

Signed-off-by: yassinnouh21 <[email protected]>
Copy link
Copy Markdown
Member

@ntkathole ntkathole left a comment

Choose a reason for hiding this comment

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

looks good

@ntkathole ntkathole merged commit edf25af into feast-dev:master Apr 13, 2026
33 of 35 checks passed
korbonits pushed a commit to korbonits/feast that referenced this pull request Apr 13, 2026
…e stores (feast-dev#6257)

* feat: Add feature view versioning support to Redis and DynamoDB online stores

Redis: Add _versioned_fv_name() helper that computes versioned feature view
names (e.g. driver_stats_v2) used in hash field keys (_ts: and mmh3 feature
hashes). This ensures version isolation within the same entity hash key.

DynamoDB: Modify _get_table_name() to apply version suffix before template
formatting, so each version gets its own DynamoDB table.

Both stores are registered in _check_versioned_read_support() and the error
message is updated accordingly.

Closes feast-dev#6164, closes feast-dev#6163

Signed-off-by: yassinnouh21 <[email protected]>

* fix: Add pragma allowlist for dummy moto credentials in DynamoDB test

Signed-off-by: yassinnouh21 <[email protected]>

* fix: Catch Exception instead of ImportError for Redis/DynamoDB in versioning gate

Redis and DynamoDB modules raise FeastExtrasDependencyImportError (not
ImportError) when their dependencies are missing. Use broad Exception
catch so environments without redis/boto3 don't break.

Signed-off-by: yassinnouh21 <[email protected]>

* refactor: Extract shared compute_versioned_name helper to helpers.py

Move version resolution logic into a shared compute_versioned_name()
in helpers.py, reused by Redis, DynamoDB, and compute_table_id().
Addresses reviewer feedback to avoid duplicating version logic.

Signed-off-by: yassinnouh21 <[email protected]>

---------

Signed-off-by: yassinnouh21 <[email protected]>
Signed-off-by: Alex Korbonits <[email protected]>
franciscojavierarceo pushed a commit that referenced this pull request May 4, 2026
# [0.63.0](v0.62.0...v0.63.0) (2026-05-04)

### Bug Fixes

* Add project filter to apply_data_source and delete_data_source (closes [#6206](#6206)) ([#6322](#6322)) ([96562c4](96562c4))
* Add project_id filter to SnowflakeRegistry UPDATE path ([#6243](#6243)) ([6658b71](6658b71)), closes [#6208](#6208) [#6208](#6208)
* Add subprocess timeouts to prevent test_e2e_local hanging on Dask atexit handler ([3de6556](3de6556))
* Ambiguous truth value of array during materialization ([#6259](#6259)) ([d0c8984](d0c8984))
* Auto-detect GCS/S3 registry store when registry is passed as string ([#6260](#6260)) ([7ebcf03](7ebcf03))
* **bigquery:** Prefer query over table in get_table_query_string ([#6360](#6360)) ([77ed779](77ed779)), closes [#6200](#6200)
* correct project_id scoping in get_user_metadata and delete_project ([0c469a7](0c469a7))
* disable Redis RDB persistence in test deployments ([44cd682](44cd682))
* Disable snowflake tests temporarily in CI ([#6356](#6356)) ([31d5a98](31d5a98))
* Filter empty SQL commands at execute_snowflake_statement call sites ([#6249](#6249)) ([92ffbb9](92ffbb9))
* Fix five bugs in milvus online store ([#6275](#6275)) ([212504b](212504b))
* Fix issue with apply feature view ([835cda8](835cda8))
* Fix streaming materialization for exotic sources with lazy UDF pipelines ([c07972d](c07972d))
* Handle missing features gracefully instead of panicking ([7d00b3a](7d00b3a))
* Harden informer cache with label selectors and memory optimizations ([#6242](#6242)) ([3f11356](3f11356))
* **helm:** Avoid nil pointer for metrics.enabled inside podAnnotations ([#6251](#6251)) ([c833f1a](c833f1a))
* Include git in feast server image ([fb03c46](fb03c46))
* Include StreamFeatureView in freshness metric ([#6269](#6269)) ([463f16c](463f16c))
* Pre-create S3A event log dir before SparkContext init ([#6317](#6317)) ([9feca77](9feca77))
* Remote Online Store Type Inference Error with All-NULL Columns ([#6063](#6063)) ([de67bdd](de67bdd))
* Remove selector with kustomize overlay using a JSON 6902 patch ([9107a43](9107a43))
* Resolve multiple bugs in SnowflakeRegistry and Snowflake connection handling ([#6315](#6315)) ([7e66a2e](7e66a2e))
* **spark:** BatchFeatureView with TransformationMode.PYTHON now reads all source columns ([a310eaf](a310eaf))
* **spark:** Use SELECT * when feature_name_columns is empty in pull_all_from_table_or_query ([e1b1d2d](e1b1d2d))
* Support pandas mode in feature builder and fix dask column extraction ([863315e](863315e))
* support SQL string as entity_df in RemoteOfflineStore.get_historical_features ([c559889](c559889))
* Wrap LocalOutputNode return value in ArrowTableValue for consist… ([#6286](#6286)) ([a16cd55](a16cd55))

### Features

* Add agent skills and Cursor/Claude rules for Feast development ([312eea3](312eea3))
* Add feature view versioning support to FAISS online store ([b36acb7](b36acb7))
* Add feature view versioning support to Redis and DynamoDB online stores ([#6257](#6257)) ([edf25af](edf25af)), closes [#6164](#6164) [#6163](#6163)
* Add optional 'org' in feature view ([#6288](#6288)) ([#6301](#6301)) ([608b105](608b105))
* Add RaySource, to_ray_dataset first-class method, docs, and tests ([1c98157](1c98157))
* Add TLS support for Go Feature Server ([#6229](#6229)) ([28a58d0](28a58d0))
* Add Vector Search support to MongoDBOnlineStore ([#6344](#6344)) ([c102738](c102738))
* Add versioning support to Milvus online store ([#6330](#6330)) ([3268ced](3268ced))
* Addresses performance issues in the Redis online store ([2e50da0](2e50da0))
* Allow to set gpu for ray ([5580ab4](5580ab4))
* Bump redis-py version cap from <5 to <8 ([#6339](#6339)) ([9538180](9538180))
* Expose feature_server, materialization, and openlineage configuration via FeatureStore CRD ([ec6ecfd](ec6ecfd))
* Make online_write_batch_size configurable in MaterializationConfig ([#6268](#6268)) ([d41becf](d41becf))
* Make udf optional if agg defined ([#5689](#5689)) ([#6328](#6328)) ([f630056](f630056))
* MongoDB offline store ([#6138](#6138)) ([8eebad7](8eebad7))
* Optional input_schema for ODFV ([#6308](#6308)) ([#6312](#6312)) ([f08b4e8](f08b4e8))
* Provision minimal TokenReview RBAC for OIDC auth and add SSL error logging in token parser ([#6240](#6240)) ([dca57e8](dca57e8))
* **spark:** Add compute-on-read support for BatchFeatureView in get_… ([#6357](#6357)) ([630d9f8](630d9f8))
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.

Add feature view versioning support to Redis online store Add feature view versioning support to DynamoDB online store

2 participants