1
0
mirror of https://github.com/dkmstr/openuds.git synced 2025-02-07 01:58:15 +03:00

A few more fixes for concurrency

This commit is contained in:
Adolfo Gómez García 2019-02-22 16:29:22 +01:00
parent bac0b9755e
commit 689b20ce2f
4 changed files with 19 additions and 9 deletions

View File

@ -513,10 +513,10 @@ class UserServiceManager(object):
uService.updateData(ui)
if state == State.FINISHED:
logger.debug('Service is now ready')
uService.save()
elif uService.state in (State.USABLE, State.PREPARING): # We don't want to get active deleting or deleted machines...
uService.setState(State.PREPARING)
UserServiceOpChecker.makeUnique(uService, ui, state)
uService.save(update_fields=['in_use', 'in_use_date', 'os_state', 'state', 'state_date' 'data'])
except Exception as e:
logger.exception('Unhandled exception on notyfyReady: {}'.format(e))
uService.setState(State.ERROR)

View File

@ -40,15 +40,17 @@ from uds.models import UserService
import logging
__updated__ = '2017-06-15'
__updated__ = '2019-02-22'
logger = logging.getLogger(__name__)
USERSERVICE_TAG = 'cm-'
# State updaters
# This will be executed on current service state for checking transitions to new state, task states, etc..
class StateUpdater(object):
def __init__(self, userService, userServiceInstance=None):
self.userService = userService
self.userServiceInstance = userServiceInstance if userServiceInstance is not None else userService.getInstance()
@ -63,7 +65,7 @@ class StateUpdater(object):
if newState is not None:
self.userService.setState(newState)
self.userService.updateData(self.userServiceInstance)
self.userService.save()
self.userService.save(update_fields=['data', 'state', 'state_date'])
def checkLater(self):
UserServiceOpChecker.checkLater(self.userService, self.userServiceInstance)
@ -136,7 +138,9 @@ class UpdateFromPreparing(StateUpdater):
self.save(state)
class UpdateFromRemoving(StateUpdater):
def finish(self):
osManager = self.userServiceInstance.osmanager()
if osManager is not None:
@ -144,7 +148,9 @@ class UpdateFromRemoving(StateUpdater):
self.save(State.REMOVED)
class UpdateFromCanceling(StateUpdater):
def finish(self):
osManager = self.userServiceInstance.osmanager()
if osManager is not None:
@ -152,7 +158,9 @@ class UpdateFromCanceling(StateUpdater):
self.save(State.CANCELED)
class UpdateFromOther(StateUpdater):
def finish(self):
self.setError('Unknown running transition from {}'.format(State.toString(self.userService.state)))
@ -164,6 +172,7 @@ class UserServiceOpChecker(DelayedTask):
'''
This is the delayed task responsible of executing the service tasks and the service state transitions
'''
def __init__(self, service):
super(UserServiceOpChecker, self).__init__()
self._svrId = service.id
@ -187,6 +196,7 @@ class UserServiceOpChecker(DelayedTask):
# Fills up basic data
userService.unique_id = userServiceInstance.getUniqueId() # Updates uniqueId
userService.friendly_name = userServiceInstance.getName() # And name, both methods can modify serviceInstance, so we save it later
userService.save(update_fields=['unique_id', 'friendly_name'])
updater = {
State.PREPARING: UpdateFromPreparing,
@ -202,7 +212,7 @@ class UserServiceOpChecker(DelayedTask):
logger.exception('Checking service state')
log.doLog(userService, log.ERROR, 'Exception: {0}'.format(e), log.INTERNAL)
userService.setState(State.ERROR)
userService.save()
userService.save(update_fields=['data', 'state', 'state_date'])
@staticmethod
def checkLater(userService, ci):
@ -238,6 +248,6 @@ class UserServiceOpChecker(DelayedTask):
log.doLog(uService, log.ERROR, 'Exception: {0}'.format(e), log.INTERNAL)
try:
uService.setState(State.ERROR)
uService.save()
uService.save(update_fields=['data', 'state', 'state_date'])
except Exception:
logger.error('Can\'t update state of uService object')

View File

@ -42,7 +42,7 @@ from uds.core import Module
import six
__updated__ = '2018-03-02'
__updated__ = '2019-02-22'
STORAGE_KEY = 'osmk'
@ -215,7 +215,7 @@ class OSManager(Module):
userService.setProperty('loginsCounter', six.text_type(counter))
if save:
userService.save()
userService.save(update_fields=['data'])
def loggedOut(self, userService, userName=None, save=True):
'''
@ -258,7 +258,7 @@ class OSManager(Module):
log.useLog('logout', uniqueId, serviceIp, userName, knownUserIP, fullUserName, userService.friendly_name, userService.deployed_service.name)
if save:
userService.save()
userService.save(update_fields=['data'])
def isPersistent(self):
'''

View File

@ -208,7 +208,7 @@ class WindowsOsManager(osmanagers.OSManager):
userService.release()
else:
if notifyReady is False:
userService.save()
userService.save(update_fields=['in_use', 'in_use_date', 'os_state', 'state', 'data'])
else:
logger.debug('Notifying ready')
UserServiceManager.manager().notifyReadyFromOsManager(userService, '')