Skip to content
Merged
Changes from 1 commit
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
d82dcf2
feat: scaffold Aerospike online store
vkagamlyk Apr 20, 2026
2fa7ba0
feat: implement Aerospike online_write_batch
vkagamlyk Apr 20, 2026
4173e0a
feat: implement Aerospike online_read
vkagamlyk Apr 20, 2026
534b935
feat: implement Aerospike update and teardown
vkagamlyk Apr 20, 2026
fb4dff7
test: add Aerospike unit and integration tests
vkagamlyk Apr 20, 2026
53d5972
feat: add async online_read/write and lifecycle hooks for Aerospike
vkagamlyk Apr 20, 2026
17b1dcb
docs: add Aerospike online store reference and tuning guide
vkagamlyk Apr 20, 2026
f552a94
fix: use bytearray keys and zip-based batch mapping for Aerospike reads
vkagamlyk Apr 20, 2026
ebb3d60
docs: clarify Aerospike auth and TLS sections are Enterprise-only
vkagamlyk Apr 20, 2026
d86dcbf
feat: add aerospike to feast-operator supported online stores
vkagamlyk Apr 20, 2026
5d9e38f
fix(aerospike): project requested_features server-side and surface pe…
vkagamlyk Apr 22, 2026
5553367
feat(aerospike)!: rename total_timeout_ms -> batch_total_timeout_ms a…
vkagamlyk Apr 22, 2026
953b9d1
refactor(aerospike): use MAP_KEY_ORDERED, KEY_DIGEST, and instance-sc…
vkagamlyk Apr 22, 2026
0c8c184
feat(aerospike): add per-FV namespace/set overrides and prewriting hook
vkagamlyk Apr 30, 2026
6628607
test: update aerospike image tag
vkagamlyk Jun 16, 2026
9e76c2f
chore: sync README template and secrets baseline after master merge
vkagamlyk Jun 16, 2026
ea9da18
chore: fix secrets baseline line number for v1 operator types
vkagamlyk Jun 16, 2026
2c37c0f
docs: update aerospike docs
vkagamlyk Jun 16, 2026
e70ba39
Merge branch 'master' into feat/aerospike-online-store
vkagamlyk Jun 22, 2026
1d016f6
fix(aerospike): wire batch max_retries and fix empty projection handling
vkagamlyk Jun 22, 2026
666cb60
style(aerospike): format online_read docs assignment for ruff
vkagamlyk Jun 22, 2026
7cd0bd3
Merge branch 'master' into feat/aerospike-online-store
vkagamlyk Jun 25, 2026
dbc45fc
Merge branch 'master' into feat/aerospike-online-store
vkagamlyk Jun 26, 2026
8dd84e3
Merge branch 'master' into feat/aerospike-online-store
vkagamlyk Jun 26, 2026
4d5954d
Merge branch 'master' into feat/aerospike-online-store
vkagamlyk Jun 28, 2026
07738ab
Merge branch 'master' into feat/aerospike-online-store
vkagamlyk Jun 29, 2026
b4ccaec
Merge branch 'master' into feat/aerospike-online-store
vkagamlyk Jun 29, 2026
10a1fb3
Merge branch 'master' into feat/aerospike-online-store
vkagamlyk Jun 29, 2026
b2b98bc
chore: update pixi.lock for aerospike optional extra
vkagamlyk Jun 30, 2026
256d65d
fix(aerospike): add client init lock and batch chunking
vkagamlyk Jun 30, 2026
3766212
Merge branch 'master' into feat/aerospike-online-store
vkagamlyk Jun 30, 2026
d3ef432
Merge branch 'master' into feat/aerospike-online-store
vkagamlyk Jul 1, 2026
33f5d37
Merge branch 'master' into feat/aerospike-online-store
vkagamlyk Jul 1, 2026
d3dc67e
Merge branch 'master' into feat/aerospike-online-store
vkagamlyk Jul 2, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
feat: implement Aerospike update and teardown
Signed-off-by: Valentyn Kahamlyk <valentin.kagamlyk@gmail.com>
  • Loading branch information
vkagamlyk committed Jun 16, 2026
commit 534b9350884febecc8a2033f1ffc250cac244eec
Original file line number Diff line number Diff line change
Expand Up @@ -448,6 +448,9 @@ def _convert_raw_docs_to_proto(
results.append((ts, row_features))
return results

# ------------------------------------------------------------------
# Admin paths (update / teardown)
# ------------------------------------------------------------------
def update(
self,
config: RepoConfig,
Expand All @@ -457,14 +460,70 @@ def update(
entities_to_keep: Sequence[Entity],
partial: bool,
) -> None:
raise NotImplementedError("AerospikeOnlineStore.update is not implemented yet.")
"""Reconcile per-feature-view data when a schema change is applied.

Aerospike has no explicit schema, and records/sets are created lazily
on first write, so there is nothing to do for ``tables_to_keep`` or
either of the entity lists. For ``tables_to_delete`` we strip each
feature-view's slot out of the ``features`` and ``event_ts`` Map
CDTs on every record in the project's set.

This is issued as a single **background scan** with a combined op
list covering all feature views being removed, so the cost is a
single server-side pass regardless of how many feature views are
dropped. The scan runs asynchronously server-side and returns
immediately; this matches the intent of ``feast apply``, after
which the caller stops reading the dropped feature views anyway.
"""
if not isinstance(config.online_store, AerospikeOnlineStoreConfig):
raise RuntimeError(f"{config.online_store.type = }. It must be aerospike.")
if not tables_to_delete:
return

client = self._get_client(config)
ns = config.online_store.namespace
set_name = self._set_name(config)

remove_ops: List[Dict[str, Any]] = []
for fv in tables_to_delete:
remove_ops.append(
map_ops.map_remove_by_key(
"features", fv.name, aerospike.MAP_RETURN_NONE
)
)
remove_ops.append(
map_ops.map_remove_by_key(
"event_ts", fv.name, aerospike.MAP_RETURN_NONE
)
)

scan = client.scan(ns, set_name)
scan.add_ops(remove_ops)
scan.execute_background()

def teardown(
self,
config: RepoConfig,
tables: Sequence[FeatureView],
entities: Sequence[Entity],
) -> None:
raise NotImplementedError(
"AerospikeOnlineStore.teardown is not implemented yet."
)
"""Truncate the project's set and close the cached client.

Uses Aerospike's ``truncate(namespace, set, 0)`` — a set-scoped
metadata operation that clears every record in O(1) client time,
cheaper than Mongo's ``collection.drop()``. Passing ``0`` as the
cutoff means "drop everything regardless of last-update time".

Truncate on a non-existent set is a no-op, so calling ``teardown``
on a project that never wrote data is safe.
"""
if not isinstance(config.online_store, AerospikeOnlineStoreConfig):
raise RuntimeError(f"{config.online_store.type = }. It must be aerospike.")

client = self._get_client(config)
ns = config.online_store.namespace
set_name = self._set_name(config)
client.truncate(ns, set_name, 0)
if self._client is not None:
self._client.close()
self._client = None