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
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
'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 = {