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:
parent
fd952c9fbe
commit
ffa11a6470
@ -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)
|
||||
|
||||
|
@ -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."""
|
||||
|
@ -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')])
|
||||
|
Loading…
Reference in New Issue
Block a user