Use one query instead of two for quota_usages
The second query was unnecessary and not using a proper index. It seemed to be contributing to a deadlock issue as well. Change-Id: I1031451b25140d71380c8149d3c83827eec0d4a9 Closes-Bug: #1308715 Co-Authored-by: Chris Behrens <cbehrens@codestud.com>
This commit is contained in:
@@ -3030,38 +3030,26 @@ def _reservation_create(context, uuid, usage, project_id, user_id, resource,
|
|||||||
# code always acquires the lock on quota_usages before acquiring the lock
|
# code always acquires the lock on quota_usages before acquiring the lock
|
||||||
# on reservations.
|
# on reservations.
|
||||||
|
|
||||||
def _get_user_quota_usages(context, session, project_id, user_id):
|
def _get_project_user_quota_usages(context, session, project_id,
|
||||||
# Broken out for testability
|
user_id):
|
||||||
rows = model_query(context, models.QuotaUsage,
|
|
||||||
read_deleted="no",
|
|
||||||
session=session).\
|
|
||||||
filter_by(project_id=project_id).\
|
|
||||||
filter(or_(models.QuotaUsage.user_id == user_id,
|
|
||||||
models.QuotaUsage.user_id == None)).\
|
|
||||||
with_lockmode('update').\
|
|
||||||
all()
|
|
||||||
return dict((row.resource, row) for row in rows)
|
|
||||||
|
|
||||||
|
|
||||||
def _get_project_quota_usages(context, session, project_id):
|
|
||||||
rows = model_query(context, models.QuotaUsage,
|
rows = model_query(context, models.QuotaUsage,
|
||||||
read_deleted="no",
|
read_deleted="no",
|
||||||
session=session).\
|
session=session).\
|
||||||
filter_by(project_id=project_id).\
|
filter_by(project_id=project_id).\
|
||||||
with_lockmode('update').\
|
with_lockmode('update').\
|
||||||
all()
|
all()
|
||||||
result = dict()
|
proj_result = dict()
|
||||||
|
user_result = dict()
|
||||||
# Get the total count of in_use,reserved
|
# Get the total count of in_use,reserved
|
||||||
for row in rows:
|
for row in rows:
|
||||||
if row.resource in result:
|
proj_result.setdefault(row.resource,
|
||||||
result[row.resource]['in_use'] += row.in_use
|
dict(in_use=0, reserved=0, total=0))
|
||||||
result[row.resource]['reserved'] += row.reserved
|
proj_result[row.resource]['in_use'] += row.in_use
|
||||||
result[row.resource]['total'] += (row.in_use + row.reserved)
|
proj_result[row.resource]['reserved'] += row.reserved
|
||||||
else:
|
proj_result[row.resource]['total'] += (row.in_use + row.reserved)
|
||||||
result[row.resource] = dict(in_use=row.in_use,
|
if row.user_id is None or row.user_id == user_id:
|
||||||
reserved=row.reserved,
|
user_result[row.resource] = row
|
||||||
total=row.in_use + row.reserved)
|
return proj_result, user_result
|
||||||
return result
|
|
||||||
|
|
||||||
|
|
||||||
@require_context
|
@require_context
|
||||||
@@ -3079,10 +3067,8 @@ def quota_reserve(context, resources, project_quotas, user_quotas, deltas,
|
|||||||
user_id = context.user_id
|
user_id = context.user_id
|
||||||
|
|
||||||
# Get the current usages
|
# Get the current usages
|
||||||
user_usages = _get_user_quota_usages(context, session,
|
project_usages, user_usages = _get_project_user_quota_usages(
|
||||||
project_id, user_id)
|
context, session, project_id, user_id)
|
||||||
project_usages = _get_project_quota_usages(context, session,
|
|
||||||
project_id)
|
|
||||||
|
|
||||||
# Handle usage refresh
|
# Handle usage refresh
|
||||||
work = set(deltas.keys())
|
work = set(deltas.keys())
|
||||||
@@ -3291,11 +3277,12 @@ def _quota_reservations_query(session, context, reservations):
|
|||||||
def reservation_commit(context, reservations, project_id=None, user_id=None):
|
def reservation_commit(context, reservations, project_id=None, user_id=None):
|
||||||
session = get_session()
|
session = get_session()
|
||||||
with session.begin():
|
with session.begin():
|
||||||
usages = _get_user_quota_usages(context, session, project_id, user_id)
|
_project_usages, user_usages = _get_project_user_quota_usages(
|
||||||
|
context, session, project_id, user_id)
|
||||||
reservation_query = _quota_reservations_query(session, context,
|
reservation_query = _quota_reservations_query(session, context,
|
||||||
reservations)
|
reservations)
|
||||||
for reservation in reservation_query.all():
|
for reservation in reservation_query.all():
|
||||||
usage = usages[reservation.resource]
|
usage = user_usages[reservation.resource]
|
||||||
if reservation.delta >= 0:
|
if reservation.delta >= 0:
|
||||||
usage.reserved -= reservation.delta
|
usage.reserved -= reservation.delta
|
||||||
usage.in_use += reservation.delta
|
usage.in_use += reservation.delta
|
||||||
@@ -3307,11 +3294,12 @@ def reservation_commit(context, reservations, project_id=None, user_id=None):
|
|||||||
def reservation_rollback(context, reservations, project_id=None, user_id=None):
|
def reservation_rollback(context, reservations, project_id=None, user_id=None):
|
||||||
session = get_session()
|
session = get_session()
|
||||||
with session.begin():
|
with session.begin():
|
||||||
usages = _get_user_quota_usages(context, session, project_id, user_id)
|
_project_usages, user_usages = _get_project_user_quota_usages(
|
||||||
|
context, session, project_id, user_id)
|
||||||
reservation_query = _quota_reservations_query(session, context,
|
reservation_query = _quota_reservations_query(session, context,
|
||||||
reservations)
|
reservations)
|
||||||
for reservation in reservation_query.all():
|
for reservation in reservation_query.all():
|
||||||
usage = usages[reservation.resource]
|
usage = user_usages[reservation.resource]
|
||||||
if reservation.delta >= 0:
|
if reservation.delta >= 0:
|
||||||
usage.reserved -= reservation.delta
|
usage.reserved -= reservation.delta
|
||||||
reservation_query.soft_delete(synchronize_session=False)
|
reservation_query.soft_delete(synchronize_session=False)
|
||||||
|
|||||||
Reference in New Issue
Block a user