From a9cd1132ca391ebc43631a81b5c231defd5e376e Mon Sep 17 00:00:00 2001 From: Oleg Bondarev Date: Fri, 9 Apr 2021 15:27:23 +0300 Subject: [PATCH] Get only FIP ID on network delete Get FloatingIP object results in a quite heavy DB request. delete_disassociated_floatingips() only needs IDs. Change-Id: I6a40e6e3f937fa30bbb29768211ec8e689d4f82a (cherry picked from commit 282dc73e129b84b828d9d1d815b0b95afe093e11) --- neutron/db/l3_db.py | 9 ++++----- neutron/objects/router.py | 9 +++++++++ 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/neutron/db/l3_db.py b/neutron/db/l3_db.py index 8c1140ee610..28c203df849 100644 --- a/neutron/db/l3_db.py +++ b/neutron/db/l3_db.py @@ -1519,12 +1519,11 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase, @db_api.retry_if_session_inactive() def delete_disassociated_floatingips(self, context, network_id): - fip_objs = l3_obj.FloatingIP.get_objects( - context, - floating_network_id=network_id, router_id=None, fixed_port_id=None) + fip_ids = l3_obj.FloatingIP.get_disassociated_ids_for_net( + context, network_id) - for fip in fip_objs: - self.delete_floatingip(context, fip.id) + for fip_id in fip_ids: + self.delete_floatingip(context, fip_id) @db_api.retry_if_session_inactive() def get_floatingips_count(self, context, filters=None): diff --git a/neutron/objects/router.py b/neutron/objects/router.py index a1f727ff5d3..64e7ecffb8a 100644 --- a/neutron/objects/router.py +++ b/neutron/objects/router.py @@ -356,6 +356,15 @@ class FloatingIP(base.NeutronDbObject): row = list(next(value)) yield (cls._load_object(context, row[0]), row[1]) + @classmethod + def get_disassociated_ids_for_net(cls, context, network_id): + query = context.session.query(cls.db_model.id) + query = query.filter_by( + floating_network_id=network_id, + router_id=None, + fixed_port_id=None) + return [f.id for f in query] + @base.NeutronObjectRegistry.register class DvrFipGatewayPortAgentBinding(base.NeutronDbObject):