1010
1111from splitio .models .splits import from_raw
1212from splitio .models .telemetry import UpdateFromSSE
13+ from splitio .push import SplitStorageException
1314from splitio .push .parser import UpdateType
1415from splitio .optional .loaders import asyncio
1516from splitio .util .storage_helper import update_feature_flag_storage , update_feature_flag_storage_async
@@ -202,9 +203,28 @@ def is_running(self):
202203 """Return whether the working is running."""
203204 return self ._running
204205
206+ def _apply_iff_if_needed (self , event ):
207+ if not self ._check_instant_ff_update (event ):
208+ return False
209+
210+ try :
211+ new_feature_flag = from_raw (json .loads (self ._get_feature_flag_definition (event )))
212+ segment_list = update_feature_flag_storage (self ._feature_flag_storage , [new_feature_flag ], event .change_number )
213+ for segment_name in segment_list :
214+ if self ._segment_storage .get (segment_name ) is None :
215+ _LOGGER .debug ('Fetching new segment %s' , segment_name )
216+ self ._segment_handler (segment_name , event .change_number )
217+
218+ self ._telemetry_runtime_producer .record_update_from_sse (UpdateFromSSE .SPLIT_UPDATE )
219+ return True
220+
221+ except Exception as e :
222+ raise SplitStorageException (e )
223+
205224 def _check_instant_ff_update (self , event ):
206225 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 ():
207226 return True
227+
208228 return False
209229
210230 def _run (self ):
@@ -217,28 +237,19 @@ def _run(self):
217237 continue
218238 _LOGGER .debug ('Processing feature flag update %d' , event .change_number )
219239 try :
220- if self ._check_instant_ff_update (event ):
221- try :
222- new_feature_flag = from_raw (json .loads (self ._get_feature_flag_definition (event )))
223- segment_list = update_feature_flag_storage (self ._feature_flag_storage , [new_feature_flag ], event .change_number )
224- for segment_name in segment_list :
225- if self ._segment_storage .get (segment_name ) is None :
226- _LOGGER .debug ('Fetching new segment %s' , segment_name )
227- self ._segment_handler (segment_name , event .change_number )
228-
229- self ._telemetry_runtime_producer .record_update_from_sse (UpdateFromSSE .SPLIT_UPDATE )
230- continue
231- except Exception as e :
232- _LOGGER .error ('Exception raised in updating feature flag' )
233- _LOGGER .debug ('Exception information: ' , exc_info = True )
234- pass
240+ if self ._apply_iff_if_needed (event ):
241+ continue
242+
235243 sync_result = self ._handler (event .change_number )
236244 if not sync_result .success and sync_result .error_code is not None and sync_result .error_code == 414 :
237245 _LOGGER .error ("URI too long exception caught, sync failed" )
238246
239247 if not sync_result .success :
240248 _LOGGER .error ("feature flags sync failed" )
241249
250+ except SplitStorageException as e : # pylint: disable=broad-except
251+ _LOGGER .error ('Exception Updating Feature Flag' )
252+ _LOGGER .debug ('Exception information: ' , exc_info = True )
242253 except Exception as e : # pylint: disable=broad-except
243254 _LOGGER .error ('Exception raised in feature flag synchronization' )
244255 _LOGGER .debug ('Exception information: ' , exc_info = True )
@@ -297,6 +308,24 @@ def is_running(self):
297308 """Return whether the working is running."""
298309 return self ._running
299310
311+ async def _apply_iff_if_needed (self , event ):
312+ if not await self ._check_instant_ff_update (event ):
313+ return False
314+ try :
315+ new_feature_flag = from_raw (json .loads (self ._get_feature_flag_definition (event )))
316+ segment_list = await update_feature_flag_storage_async (self ._feature_flag_storage , [new_feature_flag ], event .change_number )
317+ for segment_name in segment_list :
318+ if await self ._segment_storage .get (segment_name ) is None :
319+ _LOGGER .debug ('Fetching new segment %s' , segment_name )
320+ await self ._segment_handler (segment_name , event .change_number )
321+
322+ await self ._telemetry_runtime_producer .record_update_from_sse (UpdateFromSSE .SPLIT_UPDATE )
323+ return True
324+
325+ except Exception as e :
326+ raise SplitStorageException (e )
327+
328+
300329 async def _check_instant_ff_update (self , event ):
301330 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 ():
302331 return True
@@ -312,22 +341,12 @@ async def _run(self):
312341 continue
313342 _LOGGER .debug ('Processing split_update %d' , event .change_number )
314343 try :
315- if await self ._check_instant_ff_update (event ):
316- try :
317- new_feature_flag = from_raw (json .loads (self ._get_feature_flag_definition (event )))
318- segment_list = await update_feature_flag_storage_async (self ._feature_flag_storage , [new_feature_flag ], event .change_number )
319- for segment_name in segment_list :
320- if await self ._segment_storage .get (segment_name ) is None :
321- _LOGGER .debug ('Fetching new segment %s' , segment_name )
322- await self ._segment_handler (segment_name , event .change_number )
323-
324- await self ._telemetry_runtime_producer .record_update_from_sse (UpdateFromSSE .SPLIT_UPDATE )
325- continue
326- except Exception as e :
327- _LOGGER .error ('Exception raised in updating feature flag' )
328- _LOGGER .debug ('Exception information: ' , exc_info = True )
329- pass
344+ if await self ._apply_iff_if_needed (event ):
345+ continue
330346 await self ._handler (event .change_number )
347+ except SplitStorageException as e : # pylint: disable=broad-except
348+ _LOGGER .error ('Exception Updating Feature Flag' )
349+ _LOGGER .debug ('Exception information: ' , exc_info = True )
331350 except Exception as e : # pylint: disable=broad-except
332351 _LOGGER .error ('Exception raised in split synchronization' )
333352 _LOGGER .debug ('Exception information: ' , exc_info = True )
0 commit comments