Avoid dhcp agent race condition on subnet and network delete

This patch ensures that, when the dhcp agent queries the server
to retrieve and delete its DHCP port, it does so by selecting
for update. This has been done by introducing a new method
that combines the get and delete in one shot.

Closes-Bug:1197627

Change-Id: I1e8a87d7dc1a1cb9309aeefd41619e20f49f95a6
This commit is contained in:
armando-migliaccio 2013-09-27 18:38:16 -07:00 committed by Gerrit Code Review
parent fd952c9fbe
commit ffa11a6470
3 changed files with 12 additions and 7 deletions

View File

@ -1402,6 +1402,14 @@ class NeutronDbPluginV2(neutron_plugin_base_v2.NeutronPluginBaseV2,
with context.session.begin(subtransactions=True):
self._delete_port(context, id)
def delete_ports(self, context, filters):
with context.session.begin(subtransactions=True):
ports = self._get_ports_query(
context, filters=filters).with_lockmode('update')
if ports:
for port in ports:
self.delete_port(context, port['id'])
def _delete_port(self, context, id):
port = self._get_port(context, id)

View File

@ -179,10 +179,7 @@ class DhcpRpcCallbackMixin(object):
{'network_id': network_id, 'host': host})
plugin = manager.NeutronManager.get_plugin()
filters = dict(network_id=[network_id], device_id=[device_id])
ports = plugin.get_ports(context, filters=filters)
if ports:
plugin.delete_port(context, ports[0]['id'])
plugin.delete_ports(context, filters=filters)
def release_port_fixed_ip(self, context, **kwargs):
"""Release the fixed_ip associated the subnet on a port."""

View File

@ -131,9 +131,9 @@ class TestDhcpRpcCallackMixin(base.BaseTestCase):
device_id='devid')
self.plugin.assert_has_calls([
mock.call.get_ports(mock.ANY, filters=dict(network_id=['netid'],
device_id=['devid'])),
mock.call.delete_port(mock.ANY, 'port_id')])
mock.call.delete_ports(mock.ANY,
filters=dict(network_id=['netid'],
device_id=['devid']))])
def test_release_port_fixed_ip(self):
port_retval = dict(id='port_id', fixed_ips=[dict(subnet_id='a')])