From 674d5e763191b22f16adb919e1fe4165749e2473 Mon Sep 17 00:00:00 2001 From: aschumann-virtualcable Date: Thu, 30 Apr 2026 16:23:26 +0200 Subject: [PATCH 1/2] Improves unused service release to trigger logout flow Switches unused assigned service cleanup to use the dedicated logout and release flow, ensuring proper session handling and resource management. Updates log message for clarity. --- server/src/uds/workers/assigned_unused.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/server/src/uds/workers/assigned_unused.py b/server/src/uds/workers/assigned_unused.py index 2e2477875..482ee294e 100644 --- a/server/src/uds/workers/assigned_unused.py +++ b/server/src/uds/workers/assigned_unused.py @@ -34,8 +34,9 @@ from django.db.models import Q, Count -from uds.core import types +from uds.core import types, osmanagers from uds.core.jobs import Job +from uds.core.managers.userservice import UserServiceManager from uds.core.util import log from uds.core.util.config import GlobalConfig from uds.core.types.states import State @@ -96,6 +97,8 @@ def run(self) -> None: us, types.log.LogLevel.INFO, source=types.log.LogSource.SERVER, - message='Removing unused assigned service', + message='Releasing (logout) unused assigned service', ) - us.release() + osmanagers.OSManager.logged_out(us, username='unused') + # release_from_logout handles cache return if pool allows it, else releases + UserServiceManager.manager().release_from_logout(us) From 35765c9ca5a6af0521d19335c8ac01b846f25d37 Mon Sep 17 00:00:00 2001 From: aschumann-virtualcable Date: Mon, 4 May 2026 15:39:19 +0200 Subject: [PATCH 2/2] Improves user service release to handle logout logic Updates the user service cleanup process to use a unified logout and release mechanism, ensuring proper handling of cached and released resources when user services are unused for too long. This change enhances resource management consistency across OS managers. --- .../src/uds/osmanagers/LinuxOsManager/linux_osmanager.py | 7 +++++-- server/src/uds/osmanagers/WindowsOsManager/windows.py | 7 +++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/server/src/uds/osmanagers/LinuxOsManager/linux_osmanager.py b/server/src/uds/osmanagers/LinuxOsManager/linux_osmanager.py index 3fcf91740..c4cd62103 100644 --- a/server/src/uds/osmanagers/LinuxOsManager/linux_osmanager.py +++ b/server/src/uds/osmanagers/LinuxOsManager/linux_osmanager.py @@ -36,6 +36,7 @@ from django.utils.translation import gettext_noop as _ from uds.core import osmanagers, types +from uds.core.managers.userservice import UserServiceManager from uds.core.ui import gui from uds.core.util import fields, log from uds.core.types.states import State @@ -115,10 +116,12 @@ def handle_unused(self, userservice: 'UserService') -> None: log.log( userservice, types.log.LogLevel.INFO, - 'Unused user service for too long. Removing due to OS Manager parameters.', + 'Unused user service for too long. Releasing (logout) due to OS Manager parameters.', types.log.LogSource.OSMANAGER, ) - userservice.release() + osmanagers.OSManager.logged_out(userservice, username='unused') + # release_from_logout handles cache return if pool allows it, else releases + UserServiceManager.manager().release_from_logout(userservice) def is_persistent(self) -> bool: return fields.onlogout_field_is_persistent(self.on_logout) diff --git a/server/src/uds/osmanagers/WindowsOsManager/windows.py b/server/src/uds/osmanagers/WindowsOsManager/windows.py index e44993e59..7c0f40634 100644 --- a/server/src/uds/osmanagers/WindowsOsManager/windows.py +++ b/server/src/uds/osmanagers/WindowsOsManager/windows.py @@ -14,6 +14,7 @@ from django.utils.translation import gettext_noop as _ from uds.core import osmanagers, types +from uds.core.managers.userservice import UserServiceManager from uds.core.ui import gui from uds.core.util import log, fields from uds.core.types.states import State @@ -107,10 +108,12 @@ def handle_unused(self, userservice: 'UserService') -> None: log.log( userservice, types.log.LogLevel.INFO, - 'Unused user service for too long. Removing due to OS Manager parameters.', + 'Unused user service for too long. Releasing (logout) due to OS Manager parameters.', types.log.LogSource.OSMANAGER, ) - userservice.release() + osmanagers.OSManager.logged_out(userservice, username='unused') + # release_from_logout handles cache return if pool allows it, else releases + UserServiceManager.manager().release_from_logout(userservice) def is_persistent(self) -> bool: return fields.onlogout_field_is_persistent(self.on_logout)