Only query for port do not get directly
It was observed in the tempest tests that the port could be already deleted by some other concurrent event when the `run` is called. This caused a flood of exception logs. Thus, with this patch we only query for the port and only update_router_port when the port was found. Closes-Bug: #2073567 Change-Id: I54d027f7cb5014d296a99029cfa0a13a7800da0a
This commit is contained in:
@@ -578,8 +578,24 @@ class LogicalSwitchPortUpdateLogicalRouterPortEvent(row_event.RowEvent):
|
||||
return False
|
||||
|
||||
def run(self, event, row, old):
|
||||
port = self.driver._plugin.get_port(self.admin_context, row.name)
|
||||
self.l3_plugin._ovn_client.update_router_port(self.admin_context, port)
|
||||
# In some cases, it is possible for the logical switch port to be
|
||||
# already removed from db by some other concurrent event when this
|
||||
# method is called. Therefore, use get_ports to just query for this
|
||||
# port instead of directly trying to get it from db causing not
|
||||
# found exception.
|
||||
ports = self.driver._plugin.get_ports(
|
||||
self.admin_context,
|
||||
filters={'id': [row.name]})
|
||||
if ports:
|
||||
self.l3_plugin._ovn_client.update_router_port(
|
||||
self.admin_context,
|
||||
ports[0])
|
||||
else:
|
||||
LOG.debug('Port %(port_id)s not found when '
|
||||
'run of %(event_name)s was called. '
|
||||
'Router port was not updated.',
|
||||
{'port_id': row.name,
|
||||
'event_name': self.event_name})
|
||||
|
||||
|
||||
class PortBindingUpdateVirtualPortsEvent(row_event.RowEvent):
|
||||
|
@@ -924,23 +924,33 @@ class TestLogicalSwitchPortUpdateLogicalRouterPortEvent(
|
||||
self.ext_api = test_extensions.setup_extensions_middleware(
|
||||
test_l3.L3TestExtensionManager())
|
||||
|
||||
def test_create_router_port(self):
|
||||
def _set_logical_port_events_add_subnet_to_router(self):
|
||||
lsp_event = WaitForLogicalSwitchPortUpdateEvent()
|
||||
lrp_event = WaitForLogicalRouterPortCreateEvent()
|
||||
self.mech_driver.nb_ovn.idl.notify_handler.watch_events(
|
||||
(lsp_event, lrp_event))
|
||||
router = self._make_router(self.fmt, self._tenant_id)
|
||||
self._router_interface_action('add', router['router']['id'],
|
||||
self.subnet['subnet']['id'], None)
|
||||
self.assertTrue(lsp_event.wait())
|
||||
self.assertTrue(lrp_event.wait())
|
||||
# Wait for the
|
||||
# ``LogicalSwitchPortUpdateLogicalRouterPortEvent.run`` call.
|
||||
time.sleep(1)
|
||||
|
||||
def test_create_router_port(self):
|
||||
with mock.patch.object(self.l3_plugin._ovn_client,
|
||||
'update_router_port') as mock_update_rp:
|
||||
lsp_event = WaitForLogicalSwitchPortUpdateEvent()
|
||||
lrp_event = WaitForLogicalRouterPortCreateEvent()
|
||||
self.mech_driver.nb_ovn.idl.notify_handler.watch_events(
|
||||
(lsp_event, lrp_event))
|
||||
self._router_interface_action('add', router['router']['id'],
|
||||
self.subnet['subnet']['id'], None)
|
||||
self.assertTrue(lsp_event.wait())
|
||||
self.assertTrue(lrp_event.wait())
|
||||
# Wait for the
|
||||
# ``LogicalSwitchPortUpdateLogicalRouterPortEvent.run`` call.
|
||||
time.sleep(1)
|
||||
self._set_logical_port_events_add_subnet_to_router()
|
||||
mock_update_rp.assert_called()
|
||||
|
||||
def test_create_router_port_port_deleted_concurrently(self):
|
||||
with mock.patch.object(self.l3_plugin._ovn_client,
|
||||
'update_router_port') as mock_update_rp, \
|
||||
mock.patch.object(self.plugin, 'get_ports', return_value=[]):
|
||||
self._set_logical_port_events_add_subnet_to_router()
|
||||
mock_update_rp.assert_not_called()
|
||||
|
||||
def test_create_non_router_port(self):
|
||||
with mock.patch.object(self.l3_plugin._ovn_client,
|
||||
'update_router_port') as mock_update_rp:
|
||||
|
Reference in New Issue
Block a user