delete_port: ensure quota usage is marked as dirty

To this aim the ORM session mapper must be used.
This patch simply uses context.session.delete rather than
query.delete, and handles UnmappedInstanceError to safely
complete the operation when the record is deleted by
another transaction.

Change-Id: I55c701fc1e2fda4461501aae532bbe11cce45b75
Closes-Bug: #1497459
This commit is contained in:
Salvatore Orlando 2015-09-18 14:57:21 -07:00
parent 12c2f969f2
commit 0cf620bdf9

View File

@ -20,6 +20,7 @@ import netaddr
from oslo_config import cfg
from oslo_db import exception as db_exc
from oslo_log import log as logging
from sqlalchemy.orm import exc as orm_exc
from neutron.api.v2 import attributes
from neutron.common import constants
@ -414,7 +415,14 @@ class IpamBackendMixin(db_base_plugin_common.DbBasePluginCommon):
enable_eagerloads(False).filter_by(id=port_id))
if not context.is_admin:
query = query.filter_by(tenant_id=context.tenant_id)
query.delete(synchronize_session=False)
# Use of the ORM mapper is needed for ensuring appropriate resource
# tracking; otherwise SQL Alchemy events won't be triggered.
# For more info check 'caveats' in doc/source/devref/quota.rst
try:
context.session.delete(query.first())
except orm_exc.UnmappedInstanceError:
LOG.debug("Port %s was not found and therefore no delete "
"operation was performed", port_id)
def _save_subnet(self, context,
network,