Always start transactions in quota cleanup methods

If the previous action that let to the quota reservation
cancelling was the result of a database connection getting
interrupted, attempting to query without calling session.begin()
will result in a sqlalchemy.exc.ResourceClosedError.

This alters the quota methods that mutate DB state to use a
transaction with the new oslo DB enginefacade decorators that
start a transaction for us.

Partial-Bug: #1596075
Partially-Implements: blueprint enginefacade-switch
Change-Id: I3d0539b11795cbcf97e70e1ec39013221a00d6d5
This commit is contained in:
Kevin Benton 2016-07-07 00:44:59 -07:00
parent 4a98b31b6a
commit 3ad23f42c7
1 changed files with 5 additions and 0 deletions

View File

@ -121,6 +121,7 @@ def set_quota_usage(context, resource, tenant_id,
usage_data.dirty)
@db_api.context_manager.writer
def set_quota_usage_dirty(context, resource, tenant_id, dirty=True):
"""Set quota usage dirty bit for a given resource and tenant.
@ -134,6 +135,7 @@ def set_quota_usage_dirty(context, resource, tenant_id, dirty=True):
return query.update({'dirty': dirty})
@db_api.context_manager.writer
def set_resources_quota_usage_dirty(context, resources, tenant_id, dirty=True):
"""Set quota usage dirty bit for a given tenant and multiple resources.
@ -151,6 +153,7 @@ def set_resources_quota_usage_dirty(context, resources, tenant_id, dirty=True):
return query.update({'dirty': dirty}, synchronize_session=False)
@db_api.context_manager.writer
def set_all_quota_usage_dirty(context, resource, dirty=True):
"""Set the dirty bit on quota usage for all tenants.
@ -196,6 +199,7 @@ def get_reservation(context, reservation_id):
for delta in resv.resource_deltas))
@db_api.context_manager.writer
def remove_reservation(context, reservation_id, set_dirty=False):
delete_query = context.session.query(quota_models.Reservation).filter_by(
id=reservation_id)
@ -250,6 +254,7 @@ def get_reservations_for_resources(context, tenant_id, resources,
for (resource, exp, total_reserved) in resv_query)
@db_api.context_manager.writer
def remove_expired_reservations(context, tenant_id=None):
now = utcnow()
resv_query = context.session.query(quota_models.Reservation)