From 48092524348bb3f7dee79819e4eb84d3f967c712 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adolfo=20G=C3=B3mez=20Garc=C3=ADa?= Date: Mon, 3 Jan 2022 14:07:46 +0100 Subject: [PATCH] Changed concurrent removal to take into account real removals, not removal checks --- .../uds/core/workers/userservice_cleaner.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/server/src/uds/core/workers/userservice_cleaner.py b/server/src/uds/core/workers/userservice_cleaner.py index 60c1c194..7ed14ab6 100644 --- a/server/src/uds/core/workers/userservice_cleaner.py +++ b/server/src/uds/core/workers/userservice_cleaner.py @@ -74,10 +74,11 @@ class UserServiceRemover(Job): friendly_name = 'User Service Cleaner' def run(self) -> None: - removeAtOnce: int = ( - GlobalConfig.USER_SERVICE_CLEAN_NUMBER.getInt() - ) # Same, it will work at reload - + # USER_SERVICE_REMOVAL_LIMIT is the maximum number of items to remove at once + # This configuration value is cached at startup, so it is not updated until next reload + removeAtOnce: int = GlobalConfig.USER_SERVICE_CLEAN_NUMBER.getInt() + manager = managers.userServiceManager() + with transaction.atomic(): removeFrom = getSqlDatetime() - timedelta( seconds=10 @@ -88,17 +89,19 @@ class UserServiceRemover(Job): state=State.REMOVABLE, state_date__lt=removeFrom, deployed_service__service__provider__maintenance_mode=False, - )[ - 0:removeAtOnce - ].iterator() + ).iterator(chunk_size=removeAtOnce) + + # We remove at once, but we limit the number of items to remove - manager = managers.userServiceManager() for removableUserService in removableUserServices: + if removeAtOnce <= 0: + break logger.debug('Checking removal of %s', removableUserService.name) try: if manager.canRemoveServiceFromDeployedService( removableUserService.deployed_service ): manager.remove(removableUserService) + removeAtOnce -= 1 # We promoted one removal except Exception: logger.exception('Exception removing user service')