1515from splitio .engine .impressions import ImpressionsMode
1616from splitio .engine .manager import Counter as ImpressionsCounter
1717from splitio .engine .strategies import StrategyNoneMode , StrategyDebugMode , StrategyOptimizedMode
18- from splitio .engine .adapters import InMemorySenderAdapter
18+ from splitio .engine .adapters import InMemorySenderAdapter , RedisSenderAdapter
1919
2020# Storage
2121from splitio .storage .inmemmory import InMemorySplitStorage , InMemorySegmentStorage , \
4343# Synchronizer
4444from splitio .sync .synchronizer import SplitTasks , SplitSynchronizers , Synchronizer , \
4545 LocalhostSynchronizer
46- from splitio .sync .manager import Manager
46+ from splitio .sync .manager import Manager , RedisManager
4747from splitio .sync .split import SplitSynchronizer , LocalSplitSynchronizer
4848from splitio .sync .segment import SegmentSynchronizer
4949from splitio .sync .impression import ImpressionSynchronizer , ImpressionsCountSynchronizer
@@ -215,6 +215,7 @@ def destroy(self, destroyed_event=None):
215215 return
216216
217217 try :
218+ _LOGGER .info ('Factory destroy called, stopping tasks.' )
218219 if self ._sync_manager is not None :
219220 if destroyed_event is not None :
220221
@@ -424,7 +425,23 @@ def _build_redis_factory(api_key, cfg):
424425 _MIN_DEFAULT_DATA_SAMPLING_ALLOWED )
425426 data_sampling = _MIN_DEFAULT_DATA_SAMPLING_ALLOWED
426427
427- imp_strategy = StrategyDebugMode () if cfg ['impressionsMode' ] == ImpressionsMode .DEBUG else StrategyOptimizedMode (ImpressionsCounter ())
428+ imp_counter = ImpressionsCounter () if cfg ['impressionsMode' ] != ImpressionsMode .DEBUG else None
429+ unique_keys_synchronizer = None
430+ clear_filter_sync = None
431+ unique_keys_task = None
432+ clear_filter_task = None
433+ if cfg ['impressionsMode' ] == ImpressionsMode .NONE :
434+ imp_strategy = StrategyNoneMode (imp_counter )
435+ clear_filter_sync = ClearFilterSynchronizer (imp_strategy .get_unique_keys_tracker ())
436+ unique_keys_synchronizer = UniqueKeysSynchronizer (RedisSenderAdapter (redis_adapter ), imp_strategy .get_unique_keys_tracker ())
437+ unique_keys_task = UniqueKeysSyncTask (unique_keys_synchronizer .send_all )
438+ clear_filter_task = ClearFilterSyncTask (clear_filter_sync .clear_all )
439+ imp_strategy .get_unique_keys_tracker ().set_queue_full_hook (unique_keys_task .flush )
440+ elif cfg ['impressionsMode' ] == ImpressionsMode .DEBUG :
441+ imp_strategy = StrategyDebugMode ()
442+ else :
443+ imp_strategy = StrategyOptimizedMode (imp_counter )
444+
428445 imp_manager = ImpressionsManager (
429446 _wrap_impression_listener (cfg ['impressionListener' ], sdk_metadata ),
430447 imp_strategy )
@@ -436,11 +453,17 @@ def _build_redis_factory(api_key, cfg):
436453 storages ['impressions' ],
437454 data_sampling ,
438455 )
456+ manager = RedisManager (unique_keys_task , clear_filter_task )
457+ initialization_thread = threading .Thread (target = manager .start , name = "SDKInitializer" )
458+ initialization_thread .setDaemon (True )
459+ initialization_thread .start ()
460+
439461 return SplitFactory (
440462 api_key ,
441463 storages ,
442464 cfg ['labelsEnabled' ],
443465 recorder ,
466+ manager ,
444467 )
445468
446469
0 commit comments