diff options
-rw-r--r-- | nova/db/sqlalchemy/api.py | 78 |
1 files changed, 30 insertions, 48 deletions
diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py index 5eade320f..9cc3b64a1 100644 --- a/nova/db/sqlalchemy/api.py +++ b/nova/db/sqlalchemy/api.py @@ -2740,7 +2740,7 @@ def quota_reserve(context, resources, quotas, deltas, expire, return reservations -def _quota_reservations(session, context, reservations): +def _quota_reservations_query(session, context, reservations): """Return the relevant reservations.""" # Get the listed reservations @@ -2748,8 +2748,7 @@ def _quota_reservations(session, context, reservations): read_deleted="no", session=session).\ filter(models.Reservation.uuid.in_(reservations)).\ - with_lockmode('update').\ - all() + with_lockmode('update') @require_context @@ -2757,17 +2756,14 @@ def reservation_commit(context, reservations): session = get_session() with session.begin(): usages = _get_quota_usages(context, session) - - for reservation in _quota_reservations(session, context, reservations): + reservation_query = _quota_reservations_query(session, context, + reservations) + for reservation in reservation_query.all(): usage = usages[reservation.resource] if reservation.delta >= 0: usage.reserved -= reservation.delta usage.in_use += reservation.delta - - reservation.delete(session=session) - - for usage in usages.values(): - usage.save(session=session) + reservation_query.soft_delete(synchronize_session=False) @require_context @@ -2775,45 +2771,33 @@ def reservation_rollback(context, reservations): session = get_session() with session.begin(): usages = _get_quota_usages(context, session) - - for reservation in _quota_reservations(session, context, reservations): + reservation_query = _quota_reservations_query(session, context, + reservations) + for reservation in reservation_query.all(): usage = usages[reservation.resource] if reservation.delta >= 0: usage.reserved -= reservation.delta - - reservation.delete(session=session) - - for usage in usages.values(): - usage.save(session=session) + reservation_query.soft_delete(synchronize_session=False) @require_admin_context def quota_destroy_all_by_project(context, project_id): session = get_session() with session.begin(): - quotas = model_query(context, models.Quota, session=session, - read_deleted="no").\ - filter_by(project_id=project_id).\ - all() - - for quota_ref in quotas: - quota_ref.delete(session=session) - - quota_usages = model_query(context, models.QuotaUsage, - session=session, read_deleted="no").\ - filter_by(project_id=project_id).\ - all() - - for quota_usage_ref in quota_usages: - quota_usage_ref.delete(session=session) + model_query(context, models.Quota, session=session, + read_deleted="no").\ + filter_by(project_id=project_id).\ + soft_delete(synchronize_session=False) - reservations = model_query(context, models.Reservation, - session=session, read_deleted="no").\ - filter_by(project_id=project_id).\ - all() + model_query(context, models.QuotaUsage, + session=session, read_deleted="no").\ + filter_by(project_id=project_id).\ + soft_delete(synchronize_session=False) - for reservation_ref in reservations: - reservation_ref.delete(session=session) + model_query(context, models.Reservation, + session=session, read_deleted="no").\ + filter_by(project_id=project_id).\ + soft_delete(synchronize_session=False) @require_admin_context @@ -2821,18 +2805,16 @@ def reservation_expire(context): session = get_session() with session.begin(): current_time = timeutils.utcnow() - results = model_query(context, models.Reservation, session=session, - read_deleted="no").\ - filter(models.Reservation.expire < current_time).\ - all() + reservation_query = model_query(context, models.Reservation, + session=session, read_deleted="no").\ + filter(models.Reservation.expire < current_time) - if results: - for reservation in results: - if reservation.delta >= 0: - reservation.usage.reserved -= reservation.delta - reservation.usage.save(session=session) + for reservation in reservation_query.join(models.QuotaUsage).all(): + if reservation.delta >= 0: + reservation.usage.reserved -= reservation.delta + reservation.usage.save(session=session) - reservation.delete(session=session) + reservation_query.soft_delete(synchronize_session=False) ################### |