Skip to content

Commit ba4e347

Browse files
committed
Fix initial segment fetch
1 parent 333919c commit ba4e347

File tree

5 files changed

+24
-4
lines changed

5 files changed

+24
-4
lines changed

splitio/client/factory.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -564,7 +564,7 @@ def _build_in_memory_factory(api_key, cfg, sdk_url=None, events_url=None, # pyl
564564

565565
synchronizers = SplitSynchronizers(
566566
SplitSynchronizer(apis['splits'], storages['splits'], storages['rule_based_segments']),
567-
SegmentSynchronizer(apis['segments'], storages['splits'], storages['segments']),
567+
SegmentSynchronizer(apis['segments'], storages['splits'], storages['segments'], storages['rule_based_segments']),
568568
ImpressionSynchronizer(apis['impressions'], storages['impressions'],
569569
cfg['impressionsBulkSize']),
570570
EventSynchronizer(apis['events'], storages['events'], cfg['eventsBulkSize']),

splitio/storage/inmemmory.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ def contains(self, segment_names):
233233

234234
def fetch_many(self, segment_names):
235235
return {rb_segment_name: self.get(rb_segment_name) for rb_segment_name in segment_names}
236-
236+
237237
class InMemoryRuleBasedSegmentStorageAsync(RuleBasedSegmentsStorage):
238238
"""InMemory implementation of a feature flag storage base."""
239239
def __init__(self):

splitio/sync/segment.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from splitio.util.backoff import Backoff
1111
from splitio.optional.loaders import asyncio, aiofiles
1212
from splitio.sync import util
13+
from splitio.util.storage_helper import get_standard_segment_names_in_rbs_storage
1314
from splitio.optional.loaders import asyncio
1415

1516
_LOGGER = logging.getLogger(__name__)
@@ -22,7 +23,7 @@
2223

2324

2425
class SegmentSynchronizer(object):
25-
def __init__(self, segment_api, feature_flag_storage, segment_storage):
26+
def __init__(self, segment_api, feature_flag_storage, segment_storage, rule_based_segment_storage):
2627
"""
2728
Class constructor.
2829
@@ -39,6 +40,7 @@ def __init__(self, segment_api, feature_flag_storage, segment_storage):
3940
self._api = segment_api
4041
self._feature_flag_storage = feature_flag_storage
4142
self._segment_storage = segment_storage
43+
self._rule_based_segment_storage = rule_based_segment_storage
4244
self._worker_pool = workerpool.WorkerPool(_MAX_WORKERS, self.synchronize_segment)
4345
self._worker_pool.start()
4446
self._backoff = Backoff(
@@ -182,8 +184,11 @@ def synchronize_segments(self, segment_names = None, dont_wait = False):
182184
"""
183185
if segment_names is None:
184186
segment_names = self._feature_flag_storage.get_segment_names()
187+
segment_names.update(get_standard_segment_names_in_rbs_storage(self._rule_based_segment_storage))
185188

186189
for segment_name in segment_names:
190+
_LOGGER.debug("Adding segment name to sync worker")
191+
_LOGGER.debug(segment_name)
187192
self._worker_pool.submit_work(segment_name)
188193
if (dont_wait):
189194
return True

splitio/sync/split.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ def _fetch_until(self, fetch_options, till=None, rbs_till=None):
139139
rbs_segment_list = update_rule_based_segment_storage(self._rule_based_segment_storage, fetched_rule_based_segments, feature_flag_changes.get('rbs')['t'], self._api.clear_storage)
140140

141141
fetched_feature_flags = [(splits.from_raw(feature_flag)) for feature_flag in feature_flag_changes.get('ff').get('d', [])]
142-
segment_list = update_feature_flag_storage(self._feature_flag_storage, fetched_feature_flags, feature_flag_changes.get('ff')['t'], self._api.clear_storage)
142+
segment_list.update(update_feature_flag_storage(self._feature_flag_storage, fetched_feature_flags, feature_flag_changes.get('ff')['t'], self._api.clear_storage))
143143
segment_list.update(rbs_segment_list)
144144

145145
if feature_flag_changes.get('ff')['t'] == feature_flag_changes.get('ff')['s'] and feature_flag_changes.get('rbs')['t'] == feature_flag_changes.get('rbs')['s']:

splitio/util/storage_helper.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,21 @@ def update_rule_based_segment_storage(rule_based_segment_storage, rule_based_seg
7070
def _get_segment_names(excluded_segments):
7171
return [excluded_segment.name for excluded_segment in excluded_segments]
7272

73+
def get_standard_segment_names_in_rbs_storage(rule_based_segment_storage):
74+
"""
75+
Retrieve a list of all standard segments names.
76+
77+
:return: Set of segment names.
78+
:rtype: Set(str)
79+
"""
80+
segment_list = set()
81+
for rb_segment in rule_based_segment_storage.get_segment_names():
82+
rb_segment_obj = rule_based_segment_storage.get(rb_segment)
83+
segment_list.update(set(_get_segment_names(rb_segment_obj.excluded.get_excluded_segments())))
84+
segment_list.update(rb_segment_obj.get_condition_segment_names())
85+
86+
return segment_list
87+
7388
async def update_feature_flag_storage_async(feature_flag_storage, feature_flags, change_number, clear_storage=False):
7489
"""
7590
Update feature flag storage from given list of feature flags while checking the flag set logic

0 commit comments

Comments
 (0)