Don't update port with host id of None

In the L3 RPC code if the host for a port is not
present, it ends up calling update_port with the
host_id set to None. This does not update the host
id at all because it's treated as an unset attribute
which leads to the same thing happening on the next
iteration. These pointless update calls are expensive
because they involve a semaphore and calls to mechanism
drivers.

This patch adjusts the logic to only send a port
update if it actually has a host to ensure is on
the port.

Change-Id: Ic55496dd2ba3abcef0a2de9fc8699c391b79fa51
Partial-Bug: #1445412
This commit is contained in:
Kevin Benton 2015-04-17 04:09:48 -07:00
parent 5d427e225e
commit a80924dc3e
2 changed files with 6 additions and 1 deletions

View File

@ -115,7 +115,7 @@ class L3RpcCallback(object):
router['id'])
def _ensure_host_set_on_port(self, context, host, port, router_id=None):
if (port and
if (port and host is not None and
(port.get('device_owner') !=
constants.DEVICE_OWNER_DVR_INTERFACE and
port.get(portbindings.HOST_ID) != host or

View File

@ -2574,6 +2574,11 @@ class L3RpcCallbackTestCase(base.BaseTestCase):
'l3plugin', new_callable=mock.PropertyMock).start()
self.l3_rpc_cb = l3_rpc.L3RpcCallback()
def test__ensure_host_set_on_port_host_id_none(self):
port = {'id': 'id', portbindings.HOST_ID: 'somehost'}
self.l3_rpc_cb._ensure_host_set_on_port(None, None, port)
self.assertFalse(self.l3_rpc_cb.plugin.update_port.called)
def test__ensure_host_set_on_port_update_on_concurrent_delete(self):
port_id = 'foo_port_id'
port = {