From 80eddc40390e63c9c1102b827997054708f2618b Mon Sep 17 00:00:00 2001 From: Oleg Bondarev Date: Thu, 15 Apr 2021 11:31:01 +0300 Subject: [PATCH] Improve Network delete performance - pass existing network dict to PRECOMMIT_DELETE ml2 handler; - skip MTU and segment update handling in case network is about to be deleted. Above gives up to 50% net delete speed-up Change-Id: I07c70db027f2ae03ffb5a95072e019e8a5fdc411 --- neutron/db/db_base_plugin_v2.py | 3 ++- neutron/plugins/ml2/plugin.py | 12 +++++++++--- neutron/services/segments/db.py | 9 ++++++--- neutron/tests/unit/extensions/test_segment.py | 3 ++- 4 files changed, 19 insertions(+), 8 deletions(-) diff --git a/neutron/db/db_base_plugin_v2.py b/neutron/db/db_base_plugin_v2.py index f4738d85d82..37c9e2d39df 100644 --- a/neutron/db/db_base_plugin_v2.py +++ b/neutron/db/db_base_plugin_v2.py @@ -505,7 +505,8 @@ class NeutronDbPluginV2(db_base_plugin_common.DbBasePluginCommon, network_db = self._get_network(context, id) network = self._make_network_dict(network_db, context=context) registry.notify(resources.NETWORK, events.PRECOMMIT_DELETE, - self, context=context, network_id=id) + self, context=context, network_id=id, + network=network) # We expire network_db here because precommit deletion # might have left the relationship stale, for example, # if we deleted a segment. diff --git a/neutron/plugins/ml2/plugin.py b/neutron/plugins/ml2/plugin.py index 889dae77fa2..4b92bfc7c67 100644 --- a/neutron/plugins/ml2/plugin.py +++ b/neutron/plugins/ml2/plugin.py @@ -1229,7 +1229,8 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2, priority=0) def _network_delete_precommit_handler(self, rtype, event, trigger, context, network_id, **kwargs): - network = self.get_network(context, network_id) + network = (kwargs.get('network') or + self.get_network(context, network_id)) mech_context = driver_context.NetworkContext(self, context, network) @@ -2297,12 +2298,14 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2, # TODO(boden); refactor into _handle_segment_change once all # event types use payloads return self._handle_segment_change( - rtype, event, trigger, payload.context, payload.latest_state) + rtype, event, trigger, payload.context, payload.latest_state, + for_net_delete=payload.metadata.get('for_net_delete')) @registry.receives(resources.SEGMENT, (events.PRECOMMIT_CREATE, events.PRECOMMIT_DELETE, events.AFTER_CREATE)) - def _handle_segment_change(self, rtype, event, trigger, context, segment): + def _handle_segment_change(self, rtype, event, trigger, context, segment, + for_net_delete=False): if (event == events.PRECOMMIT_CREATE and not isinstance(trigger, segments_plugin.Plugin)): # TODO(xiaohhui): Now, when create network, ml2 will reserve @@ -2323,6 +2326,9 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2, elif event == events.PRECOMMIT_DELETE: self.type_manager.release_network_segment(context, segment) + if for_net_delete: + return + # change in segments could affect resulting network mtu, so let's # recalculate it network_db = self._get_network(context, network_id) diff --git a/neutron/services/segments/db.py b/neutron/services/segments/db.py index 866bca33de3..db946f5f0f6 100644 --- a/neutron/services/segments/db.py +++ b/neutron/services/segments/db.py @@ -202,12 +202,15 @@ class SegmentDbMixin(object): # Do some preliminary operations before deleting segment in db registry.notify(resources.SEGMENT, events.PRECOMMIT_DELETE, self.delete_segment, context=context, - segment=segment_dict) + segment=segment_dict, + for_net_delete=for_net_delete) registry.publish(resources.SEGMENT, events.AFTER_DELETE, self.delete_segment, payload=events.DBEventPayload( - context, states=(segment_dict,), + context, metadata={ + FOR_NET_DELETE: for_net_delete}, + states=(segment_dict,), resource_id=uuid)) @@ -333,7 +336,7 @@ def _add_segment_host_mapping_for_segment(resource, event, trigger, def _delete_segments_for_network(resource, event, trigger, - context, network_id): + context, network_id, **kwargs): admin_ctx = common_utils.get_elevated_context(context) global segments_plugin if not segments_plugin: diff --git a/neutron/tests/unit/extensions/test_segment.py b/neutron/tests/unit/extensions/test_segment.py index ab14e7c4949..7614dca59c6 100644 --- a/neutron/tests/unit/extensions/test_segment.py +++ b/neutron/tests/unit/extensions/test_segment.py @@ -420,7 +420,8 @@ class TestSegment(SegmentTestCase): events.PRECOMMIT_DELETE, mock.ANY, context=mock.ANY, - network_id=mock.ANY) + network_id=mock.ANY, + network=mock.ANY) class TestSegmentML2(SegmentTestCase):