Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
5 changes: 2 additions & 3 deletions ldclient/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -263,16 +263,15 @@ def __start_up(self, start_wait: float):
else:
self._data_system = FDv2(self._config, datasystem_config)

# Provide flag evaluation function for value-change tracking
self._data_system.set_flag_value_eval_fn( # type: ignore
self.__flag_tracker = FlagTrackerImpl(
self._data_system.flag_change_listeners,
lambda key, context: self.variation(key, context, None)
)
# Expose providers and store from data system
self.__data_store_status_provider = self._data_system.data_store_status_provider
self.__data_source_status_provider = (
self._data_system.data_source_status_provider
)
self.__flag_tracker = self._data_system.flag_tracker

big_segment_store_manager = BigSegmentStoreManager(self._config.big_segments)
self.__big_segment_store_manager = big_segment_store_manager
Expand Down
9 changes: 3 additions & 6 deletions ldclient/impl/datasystem/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
from threading import Event
from typing import Protocol, runtime_checkable

from ldclient.impl.listeners import Listeners
from ldclient.interfaces import (
DataSourceStatusProvider,
DataStoreStatusProvider,
Expand Down Expand Up @@ -111,13 +112,9 @@ def data_store_status_provider(self) -> DataStoreStatusProvider:

@property
@abstractmethod
def flag_tracker(self) -> FlagTracker:
def flag_change_listeners(self) -> Listeners:
"""
Returns an interface for tracking changes in feature flag configurations.
The :class:`ldclient.interfaces.FlagTracker` contains methods for
requesting notifications about feature flag changes using an event
listener model.
Returns the collection of listeners for flag change events.
"""
raise NotImplementedError

Expand Down
16 changes: 2 additions & 14 deletions ldclient/impl/datasystem/fdv1.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,10 +60,6 @@ def __init__(self, config: Config):
# Set up data source plumbing
self._data_source_listeners = Listeners()
self._flag_change_listeners = Listeners()
self._flag_tracker_impl = FlagTrackerImpl(
self._flag_change_listeners,
lambda key, context: None, # Replaced by client to use its evaluation method
)
self._data_source_update_sink = DataSourceUpdateSinkImpl(
self._store_wrapper,
self._data_source_listeners,
Expand Down Expand Up @@ -102,14 +98,6 @@ def stop(self):
def store(self) -> ReadOnlyStore:
return self._store_wrapper

def set_flag_value_eval_fn(self, eval_fn):
"""
Injects the flag value evaluation function used by the flag tracker to
compute FlagValueChange events. The function signature should be
(key: str, context: Context) -> Any.
"""
self._flag_tracker_impl = FlagTrackerImpl(self._flag_change_listeners, eval_fn)

def set_diagnostic_accumulator(self, diagnostic_accumulator: DiagnosticAccumulator):
"""
Sets the diagnostic accumulator for streaming initialization metrics.
Expand All @@ -126,8 +114,8 @@ def data_store_status_provider(self) -> DataStoreStatusProvider:
return self._data_store_status_provider_impl

@property
def flag_tracker(self) -> FlagTracker:
return self._flag_tracker_impl
def flag_change_listeners(self) -> Listeners:
return self._flag_change_listeners

@property
def data_availability(self) -> DataAvailability:
Expand Down
20 changes: 3 additions & 17 deletions ldclient/impl/datasystem/fdv2.py
Original file line number Diff line number Diff line change
Expand Up @@ -295,12 +295,6 @@ def __init__(
wrapper, writable, self._data_store_status_provider
)

# Flag tracker (evaluation function set later by client)
self._flag_tracker = FlagTrackerImpl(
self._flag_change_listeners,
lambda key, context: None # Placeholder, replaced by client
)

# Threading
self._stop_event = Event()
self._lock = ReadWriteLock()
Expand Down Expand Up @@ -659,14 +653,6 @@ def store(self) -> ReadOnlyStore:
"""Get the underlying store for flag evaluation."""
return self._store.get_active_store()

def set_flag_value_eval_fn(self, eval_fn):
"""
Set the flag value evaluation function for the flag tracker.

:param eval_fn: Function with signature (key: str, context: Context) -> Any
"""
self._flag_tracker = FlagTrackerImpl(self._flag_change_listeners, eval_fn)

@property
def data_source_status_provider(self) -> DataSourceStatusProvider:
"""Get the data source status provider."""
Expand All @@ -678,9 +664,9 @@ def data_store_status_provider(self) -> DataStoreStatusProvider:
return self._data_store_status_provider

@property
def flag_tracker(self) -> FlagTracker:
"""Get the flag tracker for monitoring flag changes."""
return self._flag_tracker
def flag_change_listeners(self) -> Listeners:
"""Get the collection of listeners for flag change events."""
return self._flag_change_listeners

@property
def data_availability(self) -> DataAvailability:
Expand Down
16 changes: 8 additions & 8 deletions ldclient/testing/impl/datasystem/test_fdv2_datasystem.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ def listener(flag_change: FlagChange):
if count == 3:
modified.set()

fdv2.flag_tracker.add_listener(listener)
fdv2.flag_change_listeners.add(listener)

fdv2.start(set_on_ready)
assert set_on_ready.wait(1), "Data system did not become ready in time"
Expand Down Expand Up @@ -86,7 +86,7 @@ def listener(flag_change: FlagChange):
changes.append(flag_change)
changed.set()

fdv2.flag_tracker.add_listener(listener)
fdv2.flag_change_listeners.add(listener)

fdv2.start(set_on_ready)
assert set_on_ready.wait(1), "Data system did not become ready in time"
Expand Down Expand Up @@ -140,7 +140,7 @@ def listener(flag_change: FlagChange):

set_on_ready = Event()
fdv2 = FDv2(Config(sdk_key="dummy"), data_system_config)
fdv2.flag_tracker.add_listener(listener)
fdv2.flag_change_listeners.add(listener)
fdv2.start(set_on_ready)
assert set_on_ready.wait(1), "Data system did not become ready in time"

Expand Down Expand Up @@ -215,7 +215,7 @@ def listener(flag_change: FlagChange):

set_on_ready = Event()
fdv2 = FDv2(Config(sdk_key="dummy"), data_system_config)
fdv2.flag_tracker.add_listener(listener)
fdv2.flag_change_listeners.add(listener)
fdv2.start(set_on_ready)

assert set_on_ready.wait(1), "Data system did not become ready in time"
Expand Down Expand Up @@ -269,7 +269,7 @@ def listener(flag_change: FlagChange):

set_on_ready = Event()
fdv2 = FDv2(Config(sdk_key="dummy"), data_system_config)
fdv2.flag_tracker.add_listener(listener)
fdv2.flag_change_listeners.add(listener)
fdv2.start(set_on_ready)

assert set_on_ready.wait(1), "Data system did not become ready in time"
Expand Down Expand Up @@ -324,7 +324,7 @@ def listener(flag_change: FlagChange):

set_on_ready = Event()
fdv2 = FDv2(Config(sdk_key="dummy"), data_system_config)
fdv2.flag_tracker.add_listener(listener)
fdv2.flag_change_listeners.add(listener)
fdv2.start(set_on_ready)

assert set_on_ready.wait(1), "Data system did not become ready in time"
Expand Down Expand Up @@ -484,7 +484,7 @@ def listener(_: FlagChange):
if count == 3:
synchronizer_ran.set()

fdv2.flag_tracker.add_listener(listener)
fdv2.flag_change_listeners.add(listener)

fdv2.start(set_on_ready)
assert set_on_ready.wait(1), "Data system did not become ready in time"
Expand Down Expand Up @@ -537,7 +537,7 @@ def listener(_: FlagChange):
nonlocal count
count += 1

fdv2.flag_tracker.add_listener(listener)
fdv2.flag_change_listeners.add(listener)

fdv2.start(set_on_ready)
assert set_on_ready.wait(1), "Data system did not become ready in time"
Expand Down
8 changes: 4 additions & 4 deletions ldclient/testing/impl/datasystem/test_fdv2_persistence.py
Original file line number Diff line number Diff line change
Expand Up @@ -239,7 +239,7 @@ def listener(flag_change: FlagChange):
): # First change is from initial sync, second is our update
flag_changed.set()

fdv2.flag_tracker.add_listener(listener)
fdv2.flag_change_listeners.add(listener)
fdv2.start(set_on_ready)

assert set_on_ready.wait(1), "Data system did not become ready in time"
Expand Down Expand Up @@ -293,7 +293,7 @@ def listener(flag_change: FlagChange):
): # First change is from initial sync, second is our update
flag_changed.set()

fdv2.flag_tracker.add_listener(listener)
fdv2.flag_change_listeners.add(listener)
fdv2.start(set_on_ready)

assert set_on_ready.wait(1), "Data system did not become ready in time"
Expand Down Expand Up @@ -341,7 +341,7 @@ def listener(flag_change: FlagChange):
if flag_change.key == "sync-flag":
sync_flag_arrived.set()

fdv2.flag_tracker.add_listener(listener)
fdv2.flag_change_listeners.add(listener)
fdv2.start(set_on_ready)

assert set_on_ready.wait(1), "Data system did not become ready in time"
Expand Down Expand Up @@ -571,7 +571,7 @@ def test_persistent_store_outage_recovery_flushes_on_recovery():
persistent_store.reset_operation_tracking()

event = Event()
fdv2.flag_tracker.add_listener(lambda _flag_change: event.set())
fdv2.flag_change_listeners.add(lambda _flag_change: event.set())
# Simulate a new flag being added while store is "offline"
# (In reality, the store is still online, but we're testing the recovery mechanism)
td_synchronizer.update(td_synchronizer.flag("new-flag").on(False))
Expand Down