Fix race condition in delete_port method. Fix update_port method

Port can be gone between
  l3plugin.prevent_l3_port_deletion(context, id)
and port query. Need to handle it properly.
ALso need to handle non-existing port in update_port properly.

Closes-Bug: #1266537

Change-Id: Ic203f21db277f83c604a8757a8c421b3fb9ae709
This commit is contained in:
Eugene Nikanorov
2014-01-13 18:58:59 +04:00
parent d586a957df
commit 69f2572667

View File

@@ -589,9 +589,12 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2,
session = context.session
changed_fixed_ips = 'fixed_ips' in port['port']
with session.begin(subtransactions=True):
port_db = (session.query(models_v2.Port).
enable_eagerloads(False).
filter_by(id=id).with_lockmode('update').one())
try:
port_db = (session.query(models_v2.Port).
enable_eagerloads(False).
filter_by(id=id).with_lockmode('update').one())
except sql_exc.NoResultFound:
raise exc.PortNotFound(port_id=id)
original_port = self._make_port_dict(port_db)
updated_port = super(Ml2Plugin, self).update_port(context, id,
port)
@@ -644,9 +647,15 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2,
with session.begin(subtransactions=True):
if l3plugin:
l3plugin.disassociate_floatingips(context, id)
port_db = (session.query(models_v2.Port).
enable_eagerloads(False).
filter_by(id=id).with_lockmode('update').one())
try:
port_db = (session.query(models_v2.Port).
enable_eagerloads(False).
filter_by(id=id).with_lockmode('update').one())
except sql_exc.NoResultFound:
# the port existed when l3plugin.prevent_l3_port_deletion
# was called but now is already gone
LOG.debug(_("The port '%s' was deleted"), id)
return
port = self._make_port_dict(port_db)
network = self.get_network(context, port['network_id'])