Skip to content

feat: Add SingleStore online store support for feature view versioning#6195

Open
antznette1 wants to merge 18 commits intofeast-dev:masterfrom
antznette1:singlestore-online-versioning
Open

feat: Add SingleStore online store support for feature view versioning#6195
antznette1 wants to merge 18 commits intofeast-dev:masterfrom
antznette1:singlestore-online-versioning

Conversation

@antznette1
Copy link
Copy Markdown
Contributor

@antznette1 antznette1 commented Mar 29, 2026

What this PR does / why we need it:

This PR adds online feature view versioning support for the SingleStore online store when registry.enable_online_feature_view_versioning is enabled.

It updates SingleStore’s table routing to read/write from versioned namespaces (e.g. {project}_{feature_view}_v{N}) so version-qualified refs like driver_stats@v1:avg_daily_trips can be served from the correct underlying online table. It also updates the global online-store guard to allow version-qualified reads for SingleStore (and still reject unsupported stores) when versioning is enabled.

Additionally, it adds an integration/universal test covering SingleStore version-qualified reads.

Which issue(s) this PR fixes:

Fixes #6181

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

Misc

Notes:

  • Version-qualified reads are only allowed when registry.enable_online_feature_view_versioning is enabled; otherwise VersionedOnlineReadNotSupported is raised.
  • The new SingleStore integration/universal test may be skipped locally if the universal SingleStore environment is not part of the parametrized test matrix (it should run in CI where SingleStore is enabled).

Open with Devin

@antznette1 antznette1 requested review from a team as code owners March 29, 2026 22:42
@antznette1 antznette1 requested review from ejscribner, franciscojavierarceo and shuchu and removed request for a team March 29, 2026 22:42
devin-ai-integration[bot]

This comment was marked as resolved.

@antznette1 antznette1 force-pushed the singlestore-online-versioning branch from 88a6e5b to 0de8845 Compare March 30, 2026 15:26
@antznette1
Copy link
Copy Markdown
Contributor Author

Good day @franciscojavierarceo
I have created the PR, awaiting your review.

Comment thread sdk/python/feast/infra/online_stores/singlestore_online_store/singlestore.py Outdated
Comment thread sdk/python/feast/infra/online_stores/singlestore_online_store/singlestore.py Outdated
Comment thread sdk/python/feast/infra/online_stores/online_store.py Outdated
Comment thread sdk/python/feast/errors.py Outdated
devin-ai-integration[bot]

This comment was marked as resolved.

devin-ai-integration[bot]

This comment was marked as resolved.

@antznette1 antznette1 requested a review from ntkathole April 2, 2026 21:41
@ntkathole ntkathole force-pushed the singlestore-online-versioning branch from ef34979 to 857d237 Compare April 3, 2026 05:00
devin-ai-integration[bot]

This comment was marked as resolved.

devin-ai-integration[bot]

This comment was marked as resolved.

devin-ai-integration[bot]

This comment was marked as resolved.

devin-ai-integration[bot]

This comment was marked as resolved.

@antznette1 antznette1 force-pushed the singlestore-online-versioning branch from a197d10 to 6cd6eb7 Compare April 5, 2026 09:15
Comment thread infra/feast-operator/Dockerfile Outdated
@antznette1 antznette1 requested a review from ntkathole April 6, 2026 20:46
@ntkathole
Copy link
Copy Markdown
Member

@antznette1 Can you please take a look at #6193, it has shared helper added now for table name and pattern for deleting all versions in teardown ?

@antznette1 antznette1 force-pushed the singlestore-online-versioning branch from c646964 to b06b1ce Compare April 8, 2026 11:29
devin-ai-integration[bot]

This comment was marked as resolved.

devin-ai-integration[bot]

This comment was marked as resolved.

@antznette1 antznette1 force-pushed the singlestore-online-versioning branch from dbab47b to f97a997 Compare April 9, 2026 09:44
@antznette1
Copy link
Copy Markdown
Contributor Author

@ntkathole ,
Please can I get a review to this PR?

@ntkathole
Copy link
Copy Markdown
Member

@ntkathole , Please can I get a review to this PR?

@antznette1 Sure, please fix the conflicts and the tests

antznette1 and others added 18 commits April 16, 2026 13:04
Signed-off-by: antznette1 <ochiezeanthonette@gmail.com>
Signed-off-by: antznette1 <ochiezeanthonette@gmail.com>
Signed-off-by: antznette1 <ochiezeanthonette@gmail.com>
Signed-off-by: antznette1 <ochiezeanthonette@gmail.com>
Signed-off-by: antznette1 <ochiezeanthonette@gmail.com>
Signed-off-by: antznette1 <ochiezeanthonette@gmail.com>
Signed-off-by: antznette1 <ochiezeanthonette@gmail.com>
Signed-off-by: antznette1 <ochiezeanthonette@gmail.com>
Signed-off-by: antznette1 <ochiezeanthonette@gmail.com>
Signed-off-by: antznette1 <ochiezeanthonette@gmail.com>
…singlestore.py

Co-authored-by: devin-ai-integration[bot] <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Signed-off-by: antznette1 <ochiezeanthonette@gmail.com>
…singlestore.py

Co-authored-by: devin-ai-integration[bot] <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Signed-off-by: antznette1 <ochiezeanthonette@gmail.com>
Signed-off-by: antznette1 <ochiezeanthonette@gmail.com>
Signed-off-by: antznette1 <ochiezeanthonette@gmail.com>
Signed-off-by: antznette1 <ochiezeanthonette@gmail.com>
Signed-off-by: antznette1 <ochiezeanthonette@gmail.com>
Signed-off-by: antznette1 <ochiezeanthonette@gmail.com>
Signed-off-by: antznette1 <ochiezeanthonette@gmail.com>
@antznette1 antznette1 force-pushed the singlestore-online-versioning branch from f97a997 to 8a64179 Compare April 16, 2026 12:18
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 found 2 new potential issues.

View 26 additional findings in Devin Review.

Open in Devin Review

Comment on lines +76 to +95
def online_store_table_id(
project: str,
table: FeatureView,
enable_versioning: bool = False,
version: Optional[int] = None,
) -> str:
name = table.name
if enable_versioning:
version = getattr(table.projection, "version_tag", None)
if version is None:
version = getattr(table, "current_version_number", None)
if version is not None and version > 0:
name = f"{table.name}_v{version}"
return name
resolved_version = version
if resolved_version is None:
resolved_version = getattr(table.projection, "version_tag", None)
if resolved_version is None:
resolved_version = getattr(table, "current_version_number", None)
if resolved_version is not None and resolved_version > 0:
name = f"{table.name}_v{resolved_version}"
return f"{project}_{name}"


def compute_table_id(project: str, table: Any, enable_versioning: bool = False) -> str:
"""Build the online-store table name, appending a version suffix when versioning is enabled."""
return f"{project}_{compute_versioned_name(table, enable_versioning)}"
return online_store_table_id(project, table, enable_versioning)
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🔴 Removed compute_versioned_name from helpers.py but redis.py and dynamodb.py still import it

The PR refactored helpers.py by replacing compute_versioned_name with online_store_table_id, but two online store modules still import the removed function. redis.py:39 imports compute_versioned_name and uses it at redis.py:62, and dynamodb.py:27 imports it and uses it at dynamodb.py:1158. Since the PR explicitly modified both of these files (to add the registry parameter to teardown), this is an incomplete refactoring. Any user of the Redis or DynamoDB online store will get an ImportError the moment the module is loaded.

Prompt for agents
The function compute_versioned_name was removed from helpers.py and replaced with online_store_table_id, but two callers were not migrated:

1. sdk/python/feast/infra/online_stores/redis.py line 39 imports compute_versioned_name from helpers. It is used at line 62 in _versioned_fv_name(). This function returns just the versioned name (without project prefix) for Redis hash key construction. You need to either: (a) re-export a backward-compatible compute_versioned_name wrapper in helpers.py that extracts the name portion from online_store_table_id, or (b) update redis.py to use online_store_table_id and strip the project prefix, or (c) add a simpler helper that returns just the versioned name without the project prefix. Also add supports_versioned_online_reads = True to RedisOnlineStore if Redis should continue supporting versioned reads.

2. sdk/python/feast/infra/online_stores/dynamodb.py line 27 imports compute_versioned_name from helpers. It is used at line 1158 in _get_table_name(). DynamoDB uses it to get the versioned name which is then inserted into a template. Same approach needed here. Also add supports_versioned_online_reads = True to DynamoDBOnlineStore if DynamoDB should continue supporting versioned reads.

Note that the old compute_versioned_name returned just the name (e.g. 'my_view_v2') without a project prefix, while online_store_table_id returns 'project_my_view_v2'. The callers in redis.py and dynamodb.py rely on the old behavior (no project prefix), so a simple rename won't work.
Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

super().__init__(
f"Versioned feature reads (@v{version}) are not yet supported by {store_name}. "
f"Currently only SQLite, PostgreSQL, MySQL, FAISS, Redis, and DynamoDB support version-qualified feature references. "
f"Currently only SQLite, PostgreSQL, MySQL, FAISS, Redis, DynamoDB, and SingleStore support version-qualified feature references. "
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟡 VersionedOnlineReadNotSupported error message lists FAISS, Redis, DynamoDB as supported but they are no longer recognized

The error message at errors.py:145 was updated to include SingleStore but still lists "FAISS, Redis, DynamoDB" as supporting versioned reads. However, the new _check_versioned_read_support logic at online_store.py:280 only allows stores that set supports_versioned_online_reads = True (or are SqliteOnlineStore). FaissOnlineStore does not set this property, and RedisOnlineStore/DynamoDBOnlineStore don't either. So when users encounter this error on these stores, the message incorrectly tells them the store should work.

Suggested change
f"Currently only SQLite, PostgreSQL, MySQL, FAISS, Redis, DynamoDB, and SingleStore support version-qualified feature references. "
f"Currently only SQLite, PostgreSQL, MySQL, and SingleStore support version-qualified feature references. "
Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

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 SingleStore online store

2 participants