feat: Add async big segment store manager and async Redis adapter#462
Open
jsonbailey wants to merge 10 commits into
Open
feat: Add async big segment store manager and async Redis adapter#462jsonbailey wants to merge 10 commits into
jsonbailey wants to merge 10 commits into
Conversation
Adds AsyncBigSegmentStoreManager, the async Redis-backed AsyncBigSegmentStore adapter, and Redis.async_big_segment_store(). Seeds async_config.py with the self-contained AsyncBigSegmentsConfig (the full AsyncConfig lands later). Bumps the redis dependency to >=4.2.0 (required by redis.asyncio).
Drop the max_connections=10 default (and the now-unneeded redis_opts copy) so the async store passes redis_opts straight to from_url, matching the sync store. The sync side removed this cap in #387 (it throttled connections under load); redis.asyncio otherwise defaults to an effectively-unlimited pool.
…egments_common Both big_segments.py and async_big_segments.py defined the class identically (bar one docstring word); move it to a shared module imported by both, matching the evaluator_common/client_common pattern.
Fold _hash_for_user_key, EMPTY_MEMBERSHIP, and is_stale (as a free function) into big_segments_common, imported by both big_segments.py and async_big_segments.py.
Drop the redundant EMPTY_MEMBERSHIP class attribute and reference the big_segments_common module constant directly instead of via self.
keelerm84
reviewed
Jul 22, 2026
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using default effort and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 7bd5ebd. Configure here.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.

What
The async big-segments layer for the async Python SDK.
impl/async_big_segments.py—AsyncBigSegmentStoreManager(async twin of the sync manager: membership caching viaExpiringDict, status polling viaAsyncRepeatingTask) +BigSegmentStoreStatusProviderImpl.impl/integrations/redis/async_redis_big_segment_store.py— async Redis-backedAsyncBigSegmentStore(redis.asyncio).integrations/__init__.py— newRedis.async_big_segment_store(...)factory (local import of the adapter, soredisstays optional).async_config.py— seeded withAsyncBigSegmentsConfigonly (see below).testing/impl/test_async_big_segments.py(unit) +testing/integrations/test_async_redis.py(live-Redis integration, guarded byskip_database_tests).pyproject.toml— the published[redis]extra floor is unchanged (>=2.10.5); only the dev/testredisdependency is bumped to>=4.2.0so CI can exerciseredis.asyncio. Async Redis support requiresredis>=4.2.0, surfaced via a README note and the adapter's guarded import (a clear error ifredis.asynciois unavailable) rather than by raising the consumer-facing floor. Raising the published floor is deferred pending a team decision before the async client ships.Note on
async_config.pyAsyncBigSegmentStoreManagerneedsAsyncBigSegmentsConfig, which lives inasync_config.py. The fullAsyncConfigisn't extractable yet (it importsAsyncHook/AsyncPlugin/AsyncEventProcessor, which land in later slices), so this PR seedsasync_config.pywith just the self-containedAsyncBigSegmentsConfig(it depends only on the already-mergedAsyncBigSegmentStore). A later slice grows the file withAsyncConfig— mirroring how the sync SDK keepsBigSegmentsConfigalongsideConfiginconfig.py.Why
Part of the async Python SDK (epic SDK-60). Depends on the async support classes (#451) and async interfaces/store (#457), both merged.
Validation
uv run pytest ldclient/testing --ignore=ldclient/testing/integrations— 1033 passed, 2 skippeduv run pytest ldclient/testing/impl/test_async_big_segments.py— 14 passeduv run mypy ldclient— clean; isort / pycodestyle — cleantest_async_redis.py) require a live Redis (run in CI); properly guarded byskip_database_tests.SDK-2729 (epic SDK-60).
Note
Medium Risk
New experimental async evaluation path and Redis I/O affect segment targeting when adopted; sync behavior should be unchanged aside from the shared-helper refactor.
Overview
Adds the experimental async Big Segments stack for the async Python SDK:
AsyncBigSegmentsConfiginasync_config.py,AsyncBigSegmentStoreManager(membership cache,AsyncRepeatingTaskstatus polling, inline poll before first membership read), and_AsyncRedisBigSegmentStorevia newRedis.async_big_segment_store().Sync code is refactored by moving
BigSegmentStoreStatusProviderImpl,EMPTY_MEMBERSHIP,_hash_for_user_key, andis_staleintobig_segments_common.pyso sync and async managers share the same logic.Dev dependency
redisis bumped to>=4.2.0forredis.asyncioin tests; the published[redis]extra floor is unchanged. Unit and live-Redis integration tests cover the new paths.Reviewed by Cursor Bugbot for commit ea1daed. Bugbot is set up for automated code reviews on this repo. Configure here.