From e50ecfb4d0a037b249f095b24ed1a6267fa8936b Mon Sep 17 00:00:00 2001 From: Oleg Bondarev Date: Tue, 20 Apr 2021 14:21:51 +0300 Subject: [PATCH] Improve Subnet update performance DB plugin gets subnet object and this obj could be passed to IPAM to save 2 subnet DB requests. Change-Id: I3b3fe0ae8d567a8bd15c11f5f4bfa9651d302bfd (cherry picked from commit e8909a65d420a276f32fd421b3d5c673ec6857ea) --- neutron/db/db_base_plugin_v2.py | 4 ++-- neutron/db/ipam_backend_mixin.py | 5 +++-- neutron/db/ipam_pluggable_backend.py | 6 +++--- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/neutron/db/db_base_plugin_v2.py b/neutron/db/db_base_plugin_v2.py index 2d021a32e98..3e7ee28ddaf 100644 --- a/neutron/db/db_base_plugin_v2.py +++ b/neutron/db/db_base_plugin_v2.py @@ -934,8 +934,8 @@ class NeutronDbPluginV2(db_base_plugin_common.DbBasePluginCommon, self, **kwargs) with db_api.CONTEXT_WRITER.using(context): - subnet, changes = self.ipam.update_db_subnet(context, id, s, - db_pools) + subnet, changes = self.ipam.update_db_subnet( + context, id, s, db_pools, subnet_obj=subnet_obj) return self._make_subnet_dict(subnet, context=context), orig @property diff --git a/neutron/db/ipam_backend_mixin.py b/neutron/db/ipam_backend_mixin.py index 34c785e6c0b..8148f8700bd 100644 --- a/neutron/db/ipam_backend_mixin.py +++ b/neutron/db/ipam_backend_mixin.py @@ -196,7 +196,8 @@ class IpamBackendMixin(db_base_plugin_common.DbBasePluginCommon): new_type.create() return updated_types - def update_db_subnet(self, context, subnet_id, s, oldpools): + def update_db_subnet(self, context, subnet_id, s, oldpools, + subnet_obj=None): changes = {} if "dns_nameservers" in s: changes['dns_nameservers'] = ( @@ -214,7 +215,7 @@ class IpamBackendMixin(db_base_plugin_common.DbBasePluginCommon): changes['service_types'] = ( self._update_subnet_service_types(context, subnet_id, s)) - subnet_obj = self._get_subnet_object(context, subnet_id) + subnet_obj = subnet_obj or self._get_subnet_object(context, subnet_id) subnet_obj.update_fields(s) subnet_obj.update() return subnet_obj, changes diff --git a/neutron/db/ipam_pluggable_backend.py b/neutron/db/ipam_pluggable_backend.py index 6c379a1c74f..f1dc7e005df 100644 --- a/neutron/db/ipam_pluggable_backend.py +++ b/neutron/db/ipam_pluggable_backend.py @@ -494,8 +494,8 @@ class IpamPluggableBackend(ipam_backend_mixin.IpamBackendMixin): self._ipam_deallocate_ips(context, ipam_driver, port, port['fixed_ips']) - def update_db_subnet(self, context, id, s, old_pools): - subnet = obj_subnet.Subnet.get_object(context, id=id) + def update_db_subnet(self, context, id, s, old_pools, subnet_obj=None): + subnet = subnet_obj or obj_subnet.Subnet.get_object(context, id=id) old_segment_id = subnet.segment_id if subnet else None if 'segment_id' in s: self._validate_segment( @@ -506,7 +506,7 @@ class IpamPluggableBackend(ipam_backend_mixin.IpamBackendMixin): # so create unchanged copy for ipam driver subnet_copy = copy.deepcopy(s) subnet, changes = super(IpamPluggableBackend, self).update_db_subnet( - context, id, s, old_pools) + context, id, s, old_pools, subnet_obj=subnet_obj) ipam_driver = driver.Pool.get_instance(None, context) # Set old allocation pools if no new pools are provided by user.