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 , \
4242
4343# Synchronizer
4444from splitio .sync .synchronizer import SplitTasks , SplitSynchronizers , Synchronizer , \
45- LocalhostSynchronizer
46- from splitio .sync .manager import Manager
45+ LocalhostSynchronizer , RedisSynchronizer
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
@@ -329,17 +330,24 @@ def _build_in_memory_factory(api_key, cfg, sdk_url=None, events_url=None, # pyl
329330 clear_filter_sync = None
330331 unique_keys_task = None
331332 clear_filter_task = None
333+ impressions_count_sync = None
334+ impressions_count_task = None
335+
332336 if cfg ['impressionsMode' ] == ImpressionsMode .NONE :
333337 imp_strategy = StrategyNoneMode (imp_counter )
334338 clear_filter_sync = ClearFilterSynchronizer (imp_strategy .get_unique_keys_tracker ())
335339 unique_keys_synchronizer = UniqueKeysSynchronizer (InMemorySenderAdapter (apis ['telemetry' ]), imp_strategy .get_unique_keys_tracker ())
336340 unique_keys_task = UniqueKeysSyncTask (unique_keys_synchronizer .send_all )
337341 clear_filter_task = ClearFilterSyncTask (clear_filter_sync .clear_all )
338342 imp_strategy .get_unique_keys_tracker ().set_queue_full_hook (unique_keys_task .flush )
343+ impressions_count_sync = ImpressionsCountSynchronizer (apis ['impressions' ], imp_counter )
344+ impressions_count_task = ImpressionsCountSyncTask (impressions_count_sync .synchronize_counters )
339345 elif cfg ['impressionsMode' ] == ImpressionsMode .DEBUG :
340346 imp_strategy = StrategyDebugMode ()
341347 else :
342348 imp_strategy = StrategyOptimizedMode (imp_counter )
349+ impressions_count_sync = ImpressionsCountSynchronizer (apis ['impressions' ], imp_counter )
350+ impressions_count_task = ImpressionsCountSyncTask (impressions_count_sync .synchronize_counters )
343351
344352 imp_manager = ImpressionsManager (
345353 _wrap_impression_listener (cfg ['impressionListener' ], sdk_metadata ),
@@ -351,7 +359,7 @@ def _build_in_memory_factory(api_key, cfg, sdk_url=None, events_url=None, # pyl
351359 ImpressionSynchronizer (apis ['impressions' ], storages ['impressions' ],
352360 cfg ['impressionsBulkSize' ]),
353361 EventSynchronizer (apis ['events' ], storages ['events' ], cfg ['eventsBulkSize' ]),
354- ImpressionsCountSynchronizer ( apis [ 'impressions' ], imp_counter ) ,
362+ impressions_count_sync ,
355363 unique_keys_synchronizer ,
356364 clear_filter_sync
357365 )
@@ -370,7 +378,7 @@ def _build_in_memory_factory(api_key, cfg, sdk_url=None, events_url=None, # pyl
370378 cfg ['impressionsRefreshRate' ],
371379 ),
372380 EventsSyncTask (synchronizers .events_sync .synchronize_events , cfg ['eventsPushRate' ]),
373- ImpressionsCountSyncTask ( synchronizers . impressions_count_sync . synchronize_counters ) ,
381+ impressions_count_task ,
374382 unique_keys_task ,
375383 clear_filter_task
376384 )
@@ -424,23 +432,68 @@ def _build_redis_factory(api_key, cfg):
424432 _MIN_DEFAULT_DATA_SAMPLING_ALLOWED )
425433 data_sampling = _MIN_DEFAULT_DATA_SAMPLING_ALLOWED
426434
427- imp_strategy = StrategyDebugMode () if cfg ['impressionsMode' ] == ImpressionsMode .DEBUG else StrategyOptimizedMode (ImpressionsCounter ())
435+ unique_keys_synchronizer = None
436+ clear_filter_sync = None
437+ unique_keys_task = None
438+ clear_filter_task = None
439+ impressions_count_sync = None
440+ impressions_count_task = None
441+ redis_sender_adapter = RedisSenderAdapter (redis_adapter )
442+
443+ if cfg ['impressionsMode' ] == ImpressionsMode .NONE :
444+ imp_counter = ImpressionsCounter ()
445+ imp_strategy = StrategyNoneMode (imp_counter )
446+ clear_filter_sync = ClearFilterSynchronizer (imp_strategy .get_unique_keys_tracker ())
447+ unique_keys_synchronizer = UniqueKeysSynchronizer (redis_sender_adapter , imp_strategy .get_unique_keys_tracker ())
448+ unique_keys_task = UniqueKeysSyncTask (unique_keys_synchronizer .send_all )
449+ clear_filter_task = ClearFilterSyncTask (clear_filter_sync .clear_all )
450+ imp_strategy .get_unique_keys_tracker ().set_queue_full_hook (unique_keys_task .flush )
451+ impressions_count_sync = ImpressionsCountSynchronizer (redis_sender_adapter , imp_counter )
452+ impressions_count_task = ImpressionsCountSyncTask (impressions_count_sync .synchronize_counters )
453+ elif cfg ['impressionsMode' ] == ImpressionsMode .DEBUG :
454+ imp_strategy = StrategyDebugMode ()
455+ else :
456+ imp_counter = ImpressionsCounter ()
457+ imp_strategy = StrategyOptimizedMode (imp_counter )
458+ impressions_count_sync = ImpressionsCountSynchronizer (redis_sender_adapter , imp_counter )
459+ impressions_count_task = ImpressionsCountSyncTask (impressions_count_sync .synchronize_counters )
460+
428461 imp_manager = ImpressionsManager (
429462 _wrap_impression_listener (cfg ['impressionListener' ], sdk_metadata ),
430463 imp_strategy )
431464
465+ synchronizers = SplitSynchronizers (None , None , None , None ,
466+ impressions_count_sync ,
467+ unique_keys_synchronizer ,
468+ clear_filter_sync
469+ )
470+
471+ tasks = SplitTasks (None , None , None , None ,
472+ impressions_count_task ,
473+ unique_keys_task ,
474+ clear_filter_task
475+ )
476+
477+ synchronizer = RedisSynchronizer (synchronizers , tasks )
432478 recorder = PipelinedRecorder (
433479 redis_adapter .pipeline ,
434480 imp_manager ,
435481 storages ['events' ],
436482 storages ['impressions' ],
437483 data_sampling ,
438484 )
485+
486+ manager = RedisManager (synchronizer )
487+ initialization_thread = threading .Thread (target = manager .start , name = "SDKInitializer" )
488+ initialization_thread .setDaemon (True )
489+ initialization_thread .start ()
490+
439491 return SplitFactory (
440492 api_key ,
441493 storages ,
442494 cfg ['labelsEnabled' ],
443495 recorder ,
496+ manager ,
444497 )
445498
446499
0 commit comments