SIENTIAPDE-1255: Implement object destructors for Activities and ExperimentTracking to prevent AttributeError during garbage collection, and mock workflow logger in tests to avoid RuntimeWarning.

This commit is contained in:
Bruno Domingues
2025-10-20 17:53:49 -03:00
parent 52be5c4e8e
commit 4a32d712ba
3 changed files with 57 additions and 0 deletions

View File

@@ -102,6 +102,26 @@ class Activities(ExperimentTracking, MLFlow, MinIO, Training):
Training.__init__(self, logger=logger, notification_handler=notification_handler)
def __del__(self):
"""
Destructor to safely handle cleanup during garbage collection.
This prevents AttributeError when the parent Postgres.__del__ tries to access
self.engine in objects with multiple inheritance. Only attempts cleanup if
the engine attribute exists.
"""
# Only call parent __del__ if engine attribute exists
# This prevents AttributeError in multiple inheritance scenarios
if hasattr(self, 'engine'):
try:
# Call parent class __del__ if it exists
if hasattr(super(), '__del__'):
super().__del__()
except Exception: # noqa: S110, BLE001
# Silently ignore errors during garbage collection
# Logging here could cause issues if logger is already destroyed
pass
async def shutdown(self):
"""
Gracefully shutdown all activities and clean up resources.
@@ -112,5 +132,7 @@ class Activities(ExperimentTracking, MLFlow, MinIO, Training):
The method should be called before the application terminates to ensure
proper resource cleanup and prevent resource leaks.
Prefer calling this method explicitly rather than relying on __del__.
"""
ExperimentTracking.close(self)

View File

@@ -88,6 +88,23 @@ class ExperimentTracking(Postgres):
self.logger = logger
self.notification_handler = notification_handler
def __del__(self):
"""
Destructor to safely handle cleanup during garbage collection.
This prevents AttributeError when used in multiple inheritance scenarios
where the parent Postgres.__del__ might be called on objects without
the engine attribute.
"""
# Only call parent __del__ if engine attribute exists
if hasattr(self, 'engine'):
try:
if hasattr(super(), '__del__'):
super().__del__()
except Exception: # noqa: S110, BLE001
# Silently ignore errors during garbage collection
pass
@activity.defn(name='update_experiment_run')
async def update_experiment_run(self, input_data: dict[str, Any]) -> None:
"""