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
(cherry picked from commit 8a97921783)
This commit is contained in:
Cedric Brandily 2017-01-23 23:37:48 +01:00
parent 8d1fa05693
commit 651069db85
1 changed files with 6 additions and 3 deletions

View File

@ -13,6 +13,8 @@
# License for the specific language governing permissions and limitations
# under the License.
import operator
from neutron.callbacks import events
from neutron.callbacks import registry
from neutron.callbacks import resources
@ -176,9 +178,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'] = []