Skip to content

Commit dc60a51

Browse files
authored
Merge branch 'master' into feat/iceberg-local-materialization-sink
2 parents 77a8ac5 + b5090c6 commit dc60a51

15 files changed

Lines changed: 1633 additions & 310 deletions

File tree

Makefile

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -109,14 +109,10 @@ install-python-dependencies-ci: ## Install Python CI dependencies using uv pip s
109109
echo "Creating virtualenv..."; \
110110
uv venv .venv; \
111111
fi
112-
# Install CPU-only torch first to prevent CUDA dependency issues (Linux only)
113-
@if [ "$$(uname -s)" = "Linux" ]; then \
114-
echo "Installing dependencies with torch CPU index for Linux..."; \
115-
uv pip sync --torch-backend cpu sdk/python/requirements/py$(PYTHON_VERSION)-ci-requirements.txt; \
116-
else \
117-
echo "Installing dependencies from PyPI for macOS..."; \
118-
uv pip sync sdk/python/requirements/py$(PYTHON_VERSION)-ci-requirements.txt; \
119-
fi
112+
# Must match the --torch-backend used to compile the CI lock, otherwise the
113+
# recorded CPU-wheel hashes (from download.pytorch.org) fail to verify.
114+
# The lock is universal, so one command serves both Linux and macOS.
115+
uv pip sync --torch-backend cpu sdk/python/requirements/py$(PYTHON_VERSION)-ci-requirements.txt
120116
uv pip install --no-deps -e .
121117

122118
# Used in github actions/ci
@@ -139,7 +135,8 @@ lock-python-dependencies-all: ## Recompile and lock all Python dependency sets f
139135
rm -rf sdk/python/requirements/* 2>/dev/null || true
140136
$(foreach ver,$(PYTHON_VERSIONS),\
141137
pixi run --environment $(call get_env_name,$(ver)) --manifest-path infra/scripts/pixi/pixi.toml \
142-
"uv pip compile -p $(ver) --no-strip-extras pyproject.toml --extra ci \
138+
"uv pip compile -p $(ver) --universal --no-strip-extras pyproject.toml --extra ci \
139+
--torch-backend cpu \
143140
--generate-hashes --output-file sdk/python/requirements/py$(ver)-ci-requirements.txt" && \
144141
pixi run --environment $(call get_env_name,$(ver)) --manifest-path infra/scripts/pixi/pixi.toml \
145142
"uv pip compile -p $(ver) --no-strip-extras pyproject.toml \

community/maintainers.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ In alphabetical order
1111
| Achal Shah | `achals` | achals@gmail.com | Tecton |
1212
| Francisco Javier Arceo | `franciscojavierarceo` | arceofrancisco@gmail.com | Affirm |
1313
| Hao Xu | `HaoXuAI` | sduxuhao@gmail.com | JPMorgan |
14+
| Nikhil Kathole | `ntkathole` | nikhilkathole2683@gmail.com | Red Hat |
1415
| Shuchu Han | `shuchu` | shuchu.han@gmail.com | Independent |
1516
| Willem Pienaar | `woop` | will.pienaar@gmail.com | Cleric |
1617
| Zhiling Chen | `zhilingc` | chnzhlng@gmail.com | GetGround |

docs/how-to-guides/scaling-feast.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@ Since Feast is designed to be modular, it's possible to swap such components wit
88

99
### Scaling Feast Registry
1010

11-
The default Feast [registry](../getting-started/concepts/registry.md) is a file-based registry. Any changes to the feature repo, or materializing data into the online store, results in a mutation to the registry.
11+
The default Feast [registry](../getting-started/components/registry.md) is a file-based registry. Any changes to the feature repo, or materializing data into the online store, results in a mutation to the registry.
1212

1313
However, there are inherent limitations with a file-based registry, since changing a single field in the registry requires re-writing the whole registry file.
1414
With multiple concurrent writers, this presents a risk of data loss, or bottlenecks writes to the registry since all changes have to be serialized (e.g. when running materialization for multiple feature views or time ranges concurrently).
1515

16-
The recommended solution in this case is to use the [SQL based registry](../tutorials/using-scalable-registry.md), which allows concurrent, transactional, and fine-grained updates to the registry. This registry implementation requires access to an existing database (such as MySQL, Postgres, etc).
16+
The recommended solution in this case is to use the [SQL based registry](../reference/registries/sql.md), which allows concurrent, transactional, and fine-grained updates to the registry. This registry implementation requires access to an existing database (such as MySQL, Postgres, etc).
1717

1818
### Scaling Materialization
1919

infra/feast-operator/Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# Build the manager binary
2-
FROM registry.access.redhat.com/ubi9/go-toolset:1.25 AS builder
2+
FROM registry.access.redhat.com/ubi9/go-toolset:1.26 AS builder
33
ARG TARGETOS
44
ARG TARGETARCH
55
ENV GOTOOLCHAIN=auto

infra/scripts/pixi/pixi.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ platforms = ["linux-64", "osx-arm64", "osx-64"]
66
[tasks]
77

88
[dependencies]
9-
uv = ">=0.6.3"
9+
uv = ">=0.6.9"
1010

1111
[feature.py39.dependencies]
1212
python = "~=3.9.0"

pixi.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ snowflake = [
142142
"snowflake-connector-python[pandas]>=3.7,<5",
143143
]
144144
sqlite_vec = ["sqlite-vec==v0.1.6"]
145-
mcp = ["fastapi_mcp", "mcp>=1.0,<2"]
145+
mcp = ["fastapi_mcp", "mcp>=1.0,<1.30"]
146146
mlflow = ["mlflow>=2.10.0"]
147147

148148
dbt = ["dbt-artifacts-parser"]

sdk/python/feast/infra/ray_initializer.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -700,6 +700,8 @@ def _initialize_local_ray(config: Any, enable_logging: bool = False) -> None:
700700
ctx = DatasetContext.get_current()
701701
ctx.shuffle_strategy = "sort" # type: ignore
702702
ctx.enable_tensor_extension_casting = False
703+
if hasattr(ctx, "enable_arrow_backed_pandas_conversion"):
704+
ctx.enable_arrow_backed_pandas_conversion = False
703705

704706
# Log cluster info
705707
if enable_logging:
@@ -760,6 +762,8 @@ def _initialize_remote_ray(config: Any, enable_logging: bool = False) -> None:
760762
ctx = DatasetContext.get_current()
761763
ctx.shuffle_strategy = "sort" # type: ignore
762764
ctx.enable_tensor_extension_casting = False
765+
if hasattr(ctx, "enable_arrow_backed_pandas_conversion"):
766+
ctx.enable_arrow_backed_pandas_conversion = False
763767

764768
# Log cluster info
765769
if enable_logging:
@@ -853,6 +857,8 @@ def ensure_ray_initialized(
853857
ctx = DatasetContext.get_current()
854858
ctx.shuffle_strategy = "sort" # type: ignore
855859
ctx.enable_tensor_extension_casting = False
860+
if hasattr(ctx, "enable_arrow_backed_pandas_conversion"):
861+
ctx.enable_arrow_backed_pandas_conversion = False
856862
if not enable_logging:
857863
_suppress_ray_logging()
858864
_ray_initialized = True

sdk/python/feast/infra/registry/proto_registry_utils.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,14 @@ def wrapper(
6363
nonlocal cache_key, cache_value
6464

6565
kwargs_key = tuple(sorted(kwargs.items())) if kwargs else ()
66-
key = tuple(
67-
[id(registry_proto), registry_proto.version_id, project, tags, kwargs_key]
66+
# Snapshot the filter so caller mutations cannot change a cached key.
67+
tags_key = frozenset(tags.items()) if tags is not None else None
68+
key = (
69+
id(registry_proto),
70+
registry_proto.version_id,
71+
project,
72+
tags_key,
73+
kwargs_key,
6874
)
6975

7076
if key == cache_key:

0 commit comments

Comments
 (0)