Skip to content

Commit 5328afb

Browse files
authored
Merge pull request #581 from splitio/dev-polish
Polish
2 parents 2de35cb + 8143774 commit 5328afb

File tree

4 files changed

+68
-39
lines changed

4 files changed

+68
-39
lines changed

splitio/engine/evaluator.py

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -57,23 +57,9 @@ def eval_with_context(self, key, bucketing, feature_name, attrs, ctx):
5757
label = Label.KILLED
5858
_treatment = feature.default_treatment
5959
else:
60-
if feature.prerequisites is not None:
61-
prerequisites_matcher = PrerequisitesMatcher(feature.prerequisites)
62-
if not prerequisites_matcher.match(key, attrs, {
63-
'evaluator': self,
64-
'bucketing_key': bucketing,
65-
'ec': ctx}):
66-
label = Label.PREREQUISITES_NOT_MET
67-
_treatment = feature.default_treatment
60+
label, _treatment = self._check_prerequisites(feature, bucketing, key, attrs, ctx, label, _treatment)
61+
label, _treatment = self._get_treatment(feature, bucketing, key, attrs, ctx, label, _treatment)
6862

69-
if _treatment == CONTROL:
70-
treatment, label = self._treatment_for_flag(feature, key, bucketing, attrs, ctx)
71-
if treatment is None:
72-
label = Label.NO_CONDITION_MATCHED
73-
_treatment = feature.default_treatment
74-
else:
75-
_treatment = treatment
76-
7763
return {
7864
'treatment': _treatment,
7965
'configurations': feature.get_configurations_for(_treatment) if feature else None,
@@ -84,6 +70,30 @@ def eval_with_context(self, key, bucketing, feature_name, attrs, ctx):
8470
'impressions_disabled': feature.impressions_disabled if feature else None
8571
}
8672

73+
def _get_treatment(self, feature, bucketing, key, attrs, ctx, label, _treatment):
74+
if _treatment == CONTROL:
75+
treatment, label = self._treatment_for_flag(feature, key, bucketing, attrs, ctx)
76+
if treatment is None:
77+
label = Label.NO_CONDITION_MATCHED
78+
_treatment = feature.default_treatment
79+
else:
80+
_treatment = treatment
81+
82+
return label, _treatment
83+
84+
def _check_prerequisites(self, feature, bucketing, key, attrs, ctx, label, _treatment):
85+
if feature.prerequisites is not None:
86+
prerequisites_matcher = PrerequisitesMatcher(feature.prerequisites)
87+
if not prerequisites_matcher.match(key, attrs, {
88+
'evaluator': self,
89+
'bucketing_key': bucketing,
90+
'ec': ctx}):
91+
label = Label.PREREQUISITES_NOT_MET
92+
_treatment = feature.default_treatment
93+
94+
return label, _treatment
95+
96+
8797
def _treatment_for_flag(self, flag, key, bucketing, attributes, ctx):
8898
"""
8999
...

splitio/models/grammar/matchers/rule_based_segment.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,8 @@ def _match_dep_rb_segments(self, excluded_rb_segments, key, attributes, context)
6565
if key in excluded_segment.excluded.get_excluded_keys():
6666
return False
6767

68-
if self._match_dep_rb_segments(excluded_segment.excluded.get_excluded_segments(), key, attributes, context):
68+
if self._match_dep_rb_segments(excluded_segment.excluded.get_excluded_segments(), key, attributes, context) \
69+
or self._match_conditions(excluded_segment.conditions, key, attributes, context):
6970
return True
70-
71-
if self._match_conditions(excluded_segment.conditions, key, attributes, context):
72-
return True
73-
71+
7472
return False

splitio/push/workers.py

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ class CompressionMode(Enum):
3535
class WorkerBase(object, metaclass=abc.ABCMeta):
3636
"""Worker template."""
3737

38+
_fetching_segment = "Fetching new segment {segment_name}"
39+
3840
@abc.abstractmethod
3941
def is_running(self):
4042
"""Return whether the working is running."""
@@ -226,27 +228,30 @@ def _apply_iff_if_needed(self, event):
226228
segment_list = update_feature_flag_storage(self._feature_flag_storage, [new_feature_flag], event.change_number)
227229
for segment_name in segment_list:
228230
if self._segment_storage.get(segment_name) is None:
229-
_LOGGER.debug('Fetching new segment %s', segment_name)
231+
_LOGGER.debug(self._fetching_segment.format(segment_name=segment_name))
230232
self._segment_handler(segment_name, event.change_number)
231233

232234
referenced_rbs = self._get_referenced_rbs(new_feature_flag)
233-
if len(referenced_rbs) > 0 and not self._rule_based_segment_storage.contains(referenced_rbs):
234-
_LOGGER.debug('Fetching new rule based segment(s) %s', referenced_rbs)
235-
self._handler(None, event.change_number)
235+
self._fetch_rbs_segment_if_needed(referenced_rbs, event)
236236
self._telemetry_runtime_producer.record_update_from_sse(UpdateFromSSE.SPLIT_UPDATE)
237237
else:
238238
new_rbs = rbs_from_raw(json.loads(self._get_object_definition(event)))
239239
segment_list = update_rule_based_segment_storage(self._rule_based_segment_storage, [new_rbs], event.change_number)
240240
for segment_name in segment_list:
241241
if self._segment_storage.get(segment_name) is None:
242-
_LOGGER.debug('Fetching new segment %s', segment_name)
242+
_LOGGER.debug(self._fetching_segment.format(segment_name=segment_name))
243243
self._segment_handler(segment_name, event.change_number)
244244
self._telemetry_runtime_producer.record_update_from_sse(UpdateFromSSE.RBS_UPDATE)
245245
return True
246246

247247
except Exception as e:
248248
raise SplitStorageException(e)
249249

250+
def _fetch_rbs_segment_if_needed(self, referenced_rbs, event):
251+
if len(referenced_rbs) > 0 and not self._rule_based_segment_storage.contains(referenced_rbs):
252+
_LOGGER.debug('Fetching new rule based segment(s) %s', referenced_rbs)
253+
self._handler(None, event.change_number)
254+
250255
def _check_instant_ff_update(self, event):
251256
if event.update_type == UpdateType.SPLIT_UPDATE and event.compression is not None and event.previous_change_number == self._feature_flag_storage.get_change_number():
252257
return True
@@ -264,16 +269,15 @@ def _run(self):
264269
break
265270
if event == self._centinel:
266271
continue
272+
267273
_LOGGER.debug('Processing feature flag update %d', event.change_number)
268274
try:
269275
if self._apply_iff_if_needed(event):
270276
continue
277+
271278
till = None
272279
rbs_till = None
273-
if event.update_type == UpdateType.SPLIT_UPDATE:
274-
till = event.change_number
275-
else:
276-
rbs_till = event.change_number
280+
till, rbs_till = self._check_update_type(till, rbs_till, event)
277281
sync_result = self._handler(till, rbs_till)
278282
if not sync_result.success and sync_result.error_code is not None and sync_result.error_code == 414:
279283
_LOGGER.error("URI too long exception caught, sync failed")
@@ -288,6 +292,14 @@ def _run(self):
288292
_LOGGER.error('Exception raised in feature flag synchronization')
289293
_LOGGER.debug('Exception information: ', exc_info=True)
290294

295+
def _check_update_type(self, till, rbs_till, event):
296+
if event.update_type == UpdateType.SPLIT_UPDATE:
297+
till = event.change_number
298+
else:
299+
rbs_till = event.change_number
300+
301+
return till, rbs_till
302+
291303
def start(self):
292304
"""Start worker."""
293305
if self.is_running():
@@ -354,27 +366,30 @@ async def _apply_iff_if_needed(self, event):
354366
segment_list = await update_feature_flag_storage_async(self._feature_flag_storage, [new_feature_flag], event.change_number)
355367
for segment_name in segment_list:
356368
if await self._segment_storage.get(segment_name) is None:
357-
_LOGGER.debug('Fetching new segment %s', segment_name)
369+
_LOGGER.debug(self._fetching_segment.format(segment_name=segment_name))
358370
await self._segment_handler(segment_name, event.change_number)
359371

360372
referenced_rbs = self._get_referenced_rbs(new_feature_flag)
361-
if len(referenced_rbs) > 0 and not await self._rule_based_segment_storage.contains(referenced_rbs):
362-
await self._handler(None, event.change_number)
363-
373+
await self._fetch_rbs_segment_if_needed(referenced_rbs, event)
364374
await self._telemetry_runtime_producer.record_update_from_sse(UpdateFromSSE.SPLIT_UPDATE)
365375
else:
366376
new_rbs = rbs_from_raw(json.loads(self._get_object_definition(event)))
367377
segment_list = await update_rule_based_segment_storage_async(self._rule_based_segment_storage, [new_rbs], event.change_number)
368378
for segment_name in segment_list:
369379
if await self._segment_storage.get(segment_name) is None:
370-
_LOGGER.debug('Fetching new segment %s', segment_name)
380+
_LOGGER.debug(self._fetching_segment.format(segment_name=segment_name))
371381
await self._segment_handler(segment_name, event.change_number)
372382
await self._telemetry_runtime_producer.record_update_from_sse(UpdateFromSSE.RBS_UPDATE)
373383
return True
374384

375385
except Exception as e:
376386
raise SplitStorageException(e)
377387

388+
async def _fetch_rbs_segment_if_needed(self, referenced_rbs, event):
389+
if len(referenced_rbs) > 0 and not await self._rule_based_segment_storage.contains(referenced_rbs):
390+
_LOGGER.debug('Fetching new rule based segment(s) %s', referenced_rbs)
391+
await self._handler(None, event.change_number)
392+
378393
async def _check_instant_ff_update(self, event):
379394
if event.update_type == UpdateType.SPLIT_UPDATE and event.compression is not None and event.previous_change_number == await self._feature_flag_storage.get_change_number():
380395
return True

splitio/sync/split.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,12 @@ def _get_config_sets(self):
7575

7676
return ','.join(self._feature_flag_storage.flag_set_filter.sorted_flag_sets)
7777

78+
def _check_exit_conditions(self, till, rbs_till, change_number, rbs_change_number):
79+
return (till is not None and till < change_number) or (rbs_till is not None and rbs_till < rbs_change_number)
80+
81+
def _check_return_conditions(self, feature_flag_changes):
82+
return 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']
83+
7884
class SplitSynchronizer(SplitSynchronizerBase):
7985
"""Feature Flag changes synchronizer."""
8086

@@ -119,7 +125,7 @@ def _fetch_until(self, fetch_options, till=None, rbs_till=None):
119125
if rbs_change_number is None:
120126
rbs_change_number = -1
121127

122-
if (till is not None and till < change_number) or (rbs_till is not None and rbs_till < rbs_change_number):
128+
if self._check_exit_conditions(till, rbs_till, change_number, rbs_change_number):
123129
# the passed till is less than change_number, no need to perform updates
124130
return change_number, rbs_change_number, segment_list
125131

@@ -142,7 +148,7 @@ def _fetch_until(self, fetch_options, till=None, rbs_till=None):
142148
segment_list.update(update_feature_flag_storage(self._feature_flag_storage, fetched_feature_flags, feature_flag_changes.get('ff')['t'], self._api.clear_storage))
143149
segment_list.update(rbs_segment_list)
144150

145-
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']:
151+
if self._check_return_conditions(feature_flag_changes):
146152
return feature_flag_changes.get('ff')['t'], feature_flag_changes.get('rbs')['t'], segment_list
147153

148154
def _attempt_feature_flag_sync(self, fetch_options, till=None, rbs_till=None):
@@ -278,7 +284,7 @@ async def _fetch_until(self, fetch_options, till=None, rbs_till=None):
278284
if rbs_change_number is None:
279285
rbs_change_number = -1
280286

281-
if (till is not None and till < change_number) or (rbs_till is not None and rbs_till < rbs_change_number):
287+
if self._check_exit_conditions(till, rbs_till, change_number, rbs_change_number):
282288
# the passed till is less than change_number, no need to perform updates
283289
return change_number, rbs_change_number, segment_list
284290

@@ -301,7 +307,7 @@ async def _fetch_until(self, fetch_options, till=None, rbs_till=None):
301307
segment_list = await update_feature_flag_storage_async(self._feature_flag_storage, fetched_feature_flags, feature_flag_changes.get('ff')['t'], self._api.clear_storage)
302308
segment_list.update(rbs_segment_list)
303309

304-
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']:
310+
if self._check_return_conditions(feature_flag_changes):
305311
return feature_flag_changes.get('ff')['t'], feature_flag_changes.get('rbs')['t'], segment_list
306312

307313
async def _attempt_feature_flag_sync(self, fetch_options, till=None, rbs_till=None):

0 commit comments

Comments
 (0)