Skip to content

Commit

Permalink
Avoid retrieving ports if network list is empty
Browse files Browse the repository at this point in the history
In ``QoSPlugin._get_ports_with_policy``, if the network IDs list is
empty, the SQLAlchemy throws the following warning:
  SELECT statement has a cartesian product between FROM element(s)
  "subports_1", "ports", "portnumaaffinitypolicies_1",
  "testportextensions_1", "portuplinkstatuspropagation_1",
  "portdataplanestatuses_1", "standardattributes_2",
  "portdeviceprofiles_1", "ml2_port_bindings_1",
  "portsecuritybindings_1", "portdnses_1",
  "securitygroupportbindings_1", "qos_network_policy_bindings_1",
  "qos_port_policy_bindings_1", "trunks_1",
  "standardattributes_1" and FROM element "networks".  Apply
  join condition(s) between each element to resolve.

This patch avoids this query by checking the network IDs list. If the
list is empty, the expected port list will be too. This is also a
small optimization because we are skipping the port query.

This patch is also applying the same logic to the second query in this
method.

Closes-Bug: #2018000
Change-Id: Ia5380bc78cc1d0136e11cc4692069279419e285e
(cherry picked from commit 9ac59e4)
  • Loading branch information
ralonsoh committed Apr 29, 2023
1 parent 92cfdb4 commit 9fa3ed4
Showing 1 changed file with 2 additions and 2 deletions.
4 changes: 2 additions & 2 deletions neutron/services/qos/qos_plugin.py
Expand Up @@ -317,7 +317,7 @@ def _extend_port_resource_request_bulk(ports_res, noop):
def _get_ports_with_policy(self, context, policy):
networks_ids = policy.get_bound_networks()
ports_with_net_policy = ports_object.Port.get_objects(
context, network_id=networks_ids)
context, network_id=networks_ids) if networks_ids else []

# Filter only this ports which don't have overwritten policy
ports_with_net_policy = [
Expand All @@ -327,7 +327,7 @@ def _get_ports_with_policy(self, context, policy):

ports_ids = policy.get_bound_ports()
ports_with_policy = ports_object.Port.get_objects(
context, id=ports_ids)
context, id=ports_ids) if ports_ids else []
return list(set(ports_with_policy + ports_with_net_policy))

def _validate_create_port_callback(self, resource, event, trigger,
Expand Down

0 comments on commit 9fa3ed4

Please sign in to comment.