From 8a97921783cc4b7aae2b0c2fd764813fa0aa2821 Mon Sep 17 00:00:00 2001 From: Cedric Brandily Date: Mon, 23 Jan 2017 23:37:48 +0100 Subject: [PATCH] Optimize _make_firewall_dict_with_rules db queries This change optimizes _make_firewall_dict_with_rules implementation by getting rules for a firewall in one db query instead of one db query per rule (previous implementation). It improves performance: typically on my deployment _make_firewall_dict_with_rules for a firewall with 1000 rules takes 0.2s instead of 12s with previous implementation. Change-Id: Ia5cd39ec4ee388fab21884d08e2b19f6f6c484d5 Closes-Bug: #1658817 --- neutron_fwaas/db/firewall/firewall_db.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/neutron_fwaas/db/firewall/firewall_db.py b/neutron_fwaas/db/firewall/firewall_db.py index 9266bc7f8..5618de1ab 100644 --- a/neutron_fwaas/db/firewall/firewall_db.py +++ b/neutron_fwaas/db/firewall/firewall_db.py @@ -13,6 +13,8 @@ # License for the specific language governing permissions and limitations # under the License. +import operator + from neutron_lib.plugins import directory from neutron.callbacks import events @@ -177,9 +179,10 @@ class Firewall_db_mixin(fw_ext.FirewallPluginBase, base_db.CommonDbMixin): firewall = self.get_firewall(context, firewall_id) fw_policy_id = firewall['firewall_policy_id'] if fw_policy_id: - fw_policy = self.get_firewall_policy(context, fw_policy_id) - fw_rules_list = [self.get_firewall_rule( - context, rule_id) for rule_id in fw_policy['firewall_rules']] + fw_rules_list = self.get_firewall_rules( + context, filters={'firewall_policy_id': [fw_policy_id]}) + fw_rules_list = sorted( + fw_rules_list, key=operator.itemgetter('position')) firewall['firewall_rule_list'] = fw_rules_list else: firewall['firewall_rule_list'] = []