@@ -101,6 +101,11 @@ class TimeoutException(Exception):
101101class SplitFactoryBase (object ): # pylint: disable=too-many-instance-attributes
102102 """Split Factory/Container class."""
103103
104+ def __init__ (self , sdk_key , storages ):
105+ self ._sdk_key = sdk_key
106+ self ._storages = storages
107+ self ._status = None
108+
104109 def _get_storage (self , name ):
105110 """
106111 Return a reference to the specified storage.
@@ -162,8 +167,7 @@ def __init__( # pylint: disable=too-many-arguments
162167 telemetry_producer = None ,
163168 telemetry_init_producer = None ,
164169 telemetry_submitter = None ,
165- preforked_initialization = False ,
166- manager_start_task = None
170+ preforked_initialization = False
167171 ):
168172 """
169173 Class constructor.
@@ -183,8 +187,7 @@ def __init__( # pylint: disable=too-many-arguments
183187 :param preforked_initialization: Whether should be instantiated as preforked or not.
184188 :type preforked_initialization: bool
185189 """
186- self ._sdk_key = sdk_key
187- self ._storages = storages
190+ SplitFactoryBase .__init__ (self , sdk_key , storages )
188191 self ._labels_enabled = labels_enabled
189192 self ._sync_manager = sync_manager
190193 self ._recorder = recorder
@@ -328,12 +331,11 @@ def __init__( # pylint: disable=too-many-arguments
328331 labels_enabled ,
329332 recorder ,
330333 sync_manager = None ,
331- sdk_ready_flag = None ,
332334 telemetry_producer = None ,
333335 telemetry_init_producer = None ,
334336 telemetry_submitter = None ,
335- preforked_initialization = False ,
336- manager_start_task = None
337+ manager_start_task = None ,
338+ api_client = None
337339 ):
338340 """
339341 Class constructor.
@@ -353,12 +355,10 @@ def __init__( # pylint: disable=too-many-arguments
353355 :param preforked_initialization: Whether should be instantiated as preforked or not.
354356 :type preforked_initialization: bool
355357 """
356- self ._sdk_key = sdk_key
357- self ._storages = storages
358+ SplitFactoryBase .__init__ (self , sdk_key , storages )
358359 self ._labels_enabled = labels_enabled
359360 self ._sync_manager = sync_manager
360361 self ._recorder = recorder
361- self ._preforked_initialization = preforked_initialization
362362 self ._telemetry_evaluation_producer = telemetry_producer .get_telemetry_evaluation_producer ()
363363 self ._telemetry_init_producer = telemetry_init_producer
364364 self ._telemetry_submitter = telemetry_submitter
@@ -367,16 +367,14 @@ def __init__( # pylint: disable=too-many-arguments
367367 self ._manager_start_task = manager_start_task
368368 self ._status = Status .NOT_INITIALIZED
369369 self ._sdk_ready_flag = asyncio .Event ()
370- asyncio .get_running_loop ().create_task (self ._update_status_when_ready_async ())
370+ self ._ready_task = asyncio .get_running_loop ().create_task (self ._update_status_when_ready_async ())
371+ self ._api_client = api_client
371372
372373 async def _update_status_when_ready_async (self ):
373374 """Wait until the sdk is ready and update the status for async mode."""
374- if self ._preforked_initialization :
375- self ._status = Status .WAITING_FORK
376- return
377-
378375 if self ._manager_start_task is not None :
379376 await self ._manager_start_task
377+ self ._manager_start_task = None
380378 await self ._telemetry_init_producer .record_ready_time (get_current_epoch_time_ms () - self ._ready_time )
381379 redundant_factory_count , active_factory_count = _get_active_and_redundant_count ()
382380 await self ._telemetry_init_producer .record_active_and_redundant_factories (active_factory_count , redundant_factory_count )
@@ -430,14 +428,22 @@ async def destroy(self, destroyed_event=None):
430428
431429 try :
432430 _LOGGER .info ('Factory destroy called, stopping tasks.' )
431+ if self ._manager_start_task is not None and not self ._manager_start_task .done ():
432+ self ._manager_start_task .cancel ()
433+
433434 if self ._sync_manager is not None :
434435 await self ._sync_manager .stop (True )
435436
437+ if not self ._ready_task .done ():
438+ self ._ready_task .cancel ()
439+ self ._ready_task = None
440+
436441 if isinstance (self ._storages ['splits' ], RedisSplitStorageAsync ):
437442 await self ._get_storage ('splits' ).redis .close ()
438443
439444 if isinstance (self ._sync_manager , ManagerAsync ) and isinstance (self ._telemetry_submitter , InMemoryTelemetrySubmitterAsync ):
440- await self ._telemetry_submitter ._telemetry_api ._client .close_session ()
445+ await self ._api_client .close_session ()
446+
441447 except Exception as e :
442448 _LOGGER .error ('Exception destroying factory.' )
443449 _LOGGER .debug (str (e ))
@@ -453,24 +459,6 @@ def client(self):
453459 """
454460 return ClientAsync (self , self ._recorder , self ._labels_enabled )
455461
456-
457- async def resume (self ):
458- """
459- Function in charge of starting periodic/realtime synchronization after a fork.
460- """
461- if not self ._waiting_fork ():
462- _LOGGER .warning ('Cannot call resume' )
463- return
464- self ._sync_manager .recreate ()
465- self ._sdk_ready_flag = asyncio .Event ()
466- self ._sdk_internal_ready_flag = self ._sdk_ready_flag
467- self ._sync_manager ._ready_flag = self ._sdk_ready_flag
468- await self ._get_storage ('impressions' ).clear ()
469- await self ._get_storage ('events' ).clear ()
470- self ._preforked_initialization = False # reset for status updater
471- asyncio .get_running_loop ().create_task (self ._update_status_when_ready_async ())
472-
473-
474462def _wrap_impression_listener (listener , metadata ):
475463 """
476464 Wrap the impression listener if any.
@@ -718,8 +706,6 @@ async def _build_in_memory_factory_async(api_key, cfg, sdk_url=None, events_url=
718706
719707 synchronizer = SynchronizerAsync (synchronizers , tasks )
720708
721- preforked_initialization = cfg .get ('preforkedInitialization' , False )
722-
723709 manager = ManagerAsync (synchronizer , apis ['auth' ], cfg ['streamingEnabled' ],
724710 sdk_metadata , telemetry_runtime_producer , streaming_api_base_url , api_key [- 4 :])
725711
@@ -739,19 +725,13 @@ async def _build_in_memory_factory_async(api_key, cfg, sdk_url=None, events_url=
739725
740726 await telemetry_init_producer .record_config (cfg , extra_cfg , total_flag_sets , invalid_flag_sets )
741727
742- if preforked_initialization :
743- await synchronizer .sync_all (max_retry_attempts = _MAX_RETRY_SYNC_ALL )
744- await synchronizer ._split_synchronizers ._segment_sync .shutdown ()
745-
746- return SplitFactoryAsync (api_key , storages , cfg ['labelsEnabled' ],
747- recorder , manager , None , telemetry_producer , telemetry_init_producer , telemetry_submitter , preforked_initialization = preforked_initialization )
748-
749728 manager_start_task = asyncio .get_running_loop ().create_task (manager .start ())
750729
751730 return SplitFactoryAsync (api_key , storages , cfg ['labelsEnabled' ],
752- recorder , manager , manager_start_task ,
731+ recorder , manager ,
753732 telemetry_producer , telemetry_init_producer ,
754- telemetry_submitter , manager_start_task = manager_start_task )
733+ telemetry_submitter , manager_start_task = manager_start_task ,
734+ api_client = http_client )
755735
756736def _build_redis_factory (api_key , cfg ):
757737 """Build and return a split factory with redis-based storage."""
0 commit comments