Improved concurrency

This commit is contained in:
Adolfo Gómez García 2019-02-22 15:23:40 +01:00
parent efb3965d76
commit 33d2ca4ece
3 changed files with 27 additions and 11 deletions

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?eclipse-pydev version="1.0"?><pydev_project>
<pydev_property name="org.python.pydev.PYTHON_PROJECT_INTERPRETER">Default</pydev_property>
<pydev_property name="org.python.pydev.PYTHON_PROJECT_INTERPRETER">uds 2.2</pydev_property>
<pydev_property name="org.python.pydev.PYTHON_PROJECT_VERSION">python 2.7</pydev_property>
<pydev_variables_property name="org.python.pydev.PROJECT_VARIABLE_SUBSTITUTION">
<key>DJANGO_MANAGE_LOCATION</key>

View File

@ -51,7 +51,7 @@ import requests
import json
import logging
__updated__ = '2018-09-24'
__updated__ = '2019-02-22'
logger = logging.getLogger(__name__)
traceLogger = logging.getLogger('traceLog')
@ -267,15 +267,28 @@ class UserServiceManager(object):
# Now try to locate 1 from cache already "ready" (must be usable and at level 1)
with transaction.atomic():
cache = ds.cachedUserServices().select_for_update().filter(cache_level=services.UserDeployment.L1_CACHE, state=State.USABLE, os_state=State.USABLE)[:1]
if len(cache) == 0:
if len(cache) != 0:
cache = cache[0]
# Ensure element is reserved correctly on DB
if ds.cachedUserServices().select_for_update().filter(uuid=cache.uuid).update(user=user, cache_level=0) != 1:
cache = None
else:
cache = None
if cache == None:
with transaction.atomic():
cache = ds.cachedUserServices().select_for_update().filter(cache_level=services.UserDeployment.L1_CACHE, state=State.USABLE)[:1]
if len(cache) > 0:
cache = cache[0]
cache.assignToUser(user)
cache.save() # Store assigned ASAP, we do not know how long assignToUser method of instance will take
if ds.cachedUserServices().select_for_update().filter(uuid=cache.uuid).update(user=user, cache_level=0) != 1:
cache = None
else:
cache = None
if cache:
cache.assignToUser(user)
cache.save() # Store assigned ASAP, we do not know how long assignToUser method of instance will take
# Out of atomic transaction
if cache is not None:
logger.debug('Found a cached-ready service from {0} for user {1}, item {2}'.format(ds, user, cache))
@ -293,6 +306,9 @@ class UserServiceManager(object):
cache = ds.cachedUserServices().select_for_update().filter(cache_level=services.UserDeployment.L1_CACHE, state=State.PREPARING)[:1]
if len(cache) > 0:
cache = cache[0]
if ds.cachedUserServices().select_for_update().filter(uuid=cache.uuid).update(user=user, cache_level=0) != 1:
cache = None
else:
cache.assignToUser(user)
cache.save()
else:

View File

@ -62,7 +62,7 @@ import logging
import pickle
import six
__updated__ = '2018-06-21'
__updated__ = '2019-02-22'
logger = logging.getLogger(__name__)
@ -442,7 +442,7 @@ class DeployedService(UUIDModel, TaggingMixin):
Returns:
A list of db records (userService) with cached user services
'''
return self.userServices.exclude(cache_level=0)
return self.userServices.exclude(cache_level=0, user=None)
def assignedUserServices(self):
'''