Public bug reported:

Listing ports in a project with large number of ports results in
querying the database which isn't efficient

Steps to reproduce:
1. Create 2000 ports in 20 different networks(the more the better) in the same 
project.
2. Enable query log for mysql using `slow_query_log` and setting 
`long_query_time` to 0.1 seconds
3. Now list the ports using `openstack port list` as non-admin user
4. The following query should be logged in the `slow_query_log_file`: 
https://paste.opendev.org/show/819649/
5. Here is part of the query that is relevant for the bug:
```
SELECT DISTINCT ports.project_id AS ports_project_id, ports.id AS ports_id, 
ports.name AS ports_name, ports.network_id AS ports_network_id, 
ports.mac_address AS ports_mac_address, ports.admin_state_up AS 
ports_admin_state_up, ports.status AS ports_status, ports.device_id AS 
ports_device_id, ports.device_owner AS ports_device_owner, ports.ip_allocation 
AS ports_ip_allocation, ports.standard_attr_id AS ports_standard_attr_id
FROM ports, networks
WHERE ports.project_id = '<project-id>' OR ports.network_id = networks.id AND 
networks.project_id = '<project-id>' ORDER BY ports.id ASC
```

6. Executing the above query responds in about 0.25 seconds <-- Which is
the problem.

7. Now update this query to use *explicit join* instead of implicit on:
```
SELECT DISTINCT ports.project_id AS ports_project_id, ports.id AS ports_id, 
ports.name AS ports_name, ports.network_id
AS ports_network_id, ports.mac_address AS ports_mac_address, 
ports.admin_state_up AS ports_admin_state_up, ports.status AS ports_status, 
ports.device_id AS ports_device_id, ports.device_owner AS ports_device_owner, 
ports.ip_allocation AS ports_ip_allocation, ports.standard_attr_id AS 
ports_standard_attr_id
FROM ports JOIN networks ON ports.network_id = networks.id
WHERE ports.project_id = '<project-id>' AND networks.project_id = 
'<project-id>' ORDER BY ports.id ASC;
```

8. The response time of this is around 0.2 seconds

Version:
- Openstack version, neutron from trunk. CommitID 
28961c8b76a4b09412825231a3f69374b183aefd
- Single node devstack on Ubuntu 22.04.02 LTS

** Affects: neutron
     Importance: Undecided
         Status: New

** Description changed:

  Listing ports in a project with large number of ports results in
  querying the database which isn't efficient
  
- 
  Steps to reproduce:
- - Create 2000 ports in 20 different networks(the more the better) in the same 
project.
- - Enable query log for mysql using `slow_query_log` and setting 
`long_query_time` to 0.1 seconds
- - Now list the ports using `openstack port list` as non-admin user
- - The following query should be logged:
- 
+ 1. Create 2000 ports in 20 different networks(the more the better) in the 
same project.
+ 2. Enable query log for mysql using `slow_query_log` and setting 
`long_query_time` to 0.1 seconds
+ 3. Now list the ports using `openstack port list` as non-admin user
+ 4. The following query should be logged: 
https://paste.opendev.org/show/819649/
+ 5. Here is part of the query that is relevant for the bug:
  ```
- SELECT anon_1.ports_project_id AS anon_1_ports_project_id, anon_1.ports_id AS 
anon_1_ports_id, anon_1.ports_name AS anon_1_ports_name, 
anon_1.ports_network_id AS anon_1_ports_network_id, anon_1.ports_mac_address AS 
anon_1_ports_mac_address, anon_1.ports_admin_state_up AS 
anon_1_ports_admin_state_up, anon_1.ports_status AS anon_1_ports_status, 
anon_1.ports_device_id AS anon_1_ports_device_id, anon_1.ports_device_owner AS 
anon_1_ports_device_owner, anon_1.ports_ip_allocation AS 
anon_1_ports_ip_allocation, anon_1.ports_standard_attr_id AS 
anon_1_ports_standard_attr_id, standardattributes_1.id AS 
standardattributes_1_id, standardattributes_1.resource_type AS 
standardattributes_1_resource_type, standardattributes_1.description AS 
standardattributes_1_description, standardattributes_1.revision_number AS 
standardattributes_1_revision_number, standardattributes_1.created_at AS 
standardattributes_1_created_at, standardattributes_1.updated_at AS 
standardattributes_1_updated_at, securitygroup
 portbindings_1.port_id AS securitygroupportbindings_1_port_id, 
securitygroupportbindings_1.security_group_id AS 
securitygroupportbindings_1_security_group_id, portdnses_1.port_id AS 
portdnses_1_port_id, portdnses_1.current_dns_name AS 
portdnses_1_current_dns_name, portdnses_1.current_dns_domain AS 
portdnses_1_current_dns_domain, portdnses_1.previous_dns_name AS 
portdnses_1_previous_dns_name, portdnses_1.previous_dns_domain AS 
portdnses_1_previous_dns_domain, portdnses_1.dns_name AS portdnses_1_dns_name, 
portdnses_1.dns_domain AS portdnses_1_dns_domain, 
qos_network_policy_bindings_1.policy_id AS 
qos_network_policy_bindings_1_policy_id, 
qos_network_policy_bindings_1.network_id AS 
qos_network_policy_bindings_1_network_id, qos_port_policy_bindings_1.policy_id 
AS qos_port_policy_bindings_1_policy_id, qos_port_policy_bindings_1.port_id AS 
qos_port_policy_bindings_1_port_id, ml2_port_bindings_1.port_id AS 
ml2_port_bindings_1_port_id, ml2_port_bindings_1.host AS 
ml2_port_bindings_1_host, ml
 2_port_bindings_1.vnic_type AS ml2_port_bindings_1_vnic_type, 
ml2_port_bindings_1.profile AS ml2_port_bindings_1_profile, 
ml2_port_bindings_1.vif_type AS ml2_port_bindings_1_vif_type, 
ml2_port_bindings_1.vif_details AS ml2_port_bindings_1_vif_details, 
ml2_port_bindings_1.status AS ml2_port_bindings_1_status, 
portsecuritybindings_1.port_id AS portsecuritybindings_1_port_id, 
portsecuritybindings_1.port_security_enabled AS 
portsecuritybindings_1_port_security_enabled, standardattributes_2.id AS 
standardattributes_2_id, standardattributes_2.resource_type AS 
standardattributes_2_resource_type, standardattributes_2.description AS 
standardattributes_2_description, standardattributes_2.revision_number AS 
standardattributes_2_revision_number, standardattributes_2.created_at AS 
standardattributes_2_created_at, standardattributes_2.updated_at AS 
standardattributes_2_updated_at, trunks_1.project_id AS trunks_1_project_id, 
trunks_1.id AS trunks_1_id, trunks_1.admin_state_up AS trunks_1_admin_sta
 te_up, trunks_1.name AS trunks_1_name, trunks_1.port_id AS trunks_1_port_id, 
trunks_1.status AS trunks_1_status, trunks_1.standard_attr_id AS 
trunks_1_standard_attr_id, subports_1.port_id AS subports_1_port_id, 
subports_1.trunk_id AS subports_1_trunk_id, subports_1.segmentation_type AS 
subports_1_segmentation_type, subports_1.segmentation_id AS 
subports_1_segmentation_id, portdataplanestatuses_1.port_id AS 
portdataplanestatuses_1_port_id, portdataplanestatuses_1.data_plane_status AS 
portdataplanestatuses_1_data_plane_status, 
portuplinkstatuspropagation_1.port_id AS portuplinkstatuspropagation_1_port_id, 
portuplinkstatuspropagation_1.propagate_uplink_status AS 
portuplinkstatuspropagation_1_propagate_uplink_status, 
portnumaaffinitypolicies_1.port_id AS portnumaaffinitypolicies_1_port_id, 
portnumaaffinitypolicies_1.numa_affinity_policy AS 
portnumaaffinitypolicies_1_numa_affinity_policy, portdeviceprofiles_1.port_id 
AS portdeviceprofiles_1_port_id, portdeviceprofiles_1.device_profile AS
  portdeviceprofiles_1_device_profile 
- FROM (SELECT DISTINCT ports.project_id AS ports_project_id, ports.id AS 
ports_id, ports.name AS ports_name, ports.network_id AS ports_network_id, 
ports.mac_address AS ports_mac_address, ports.admin_state_up AS 
ports_admin_state_up, ports.status AS ports_status, ports.device_id AS 
ports_device_id, ports.device_owner AS ports_device_owner, ports.ip_allocation 
AS ports_ip_allocation, ports.standard_attr_id AS ports_standard_attr_id 
- FROM ports, networks 
- WHERE ports.project_id = '<project-id>' OR ports.network_id = networks.id AND 
networks.project_id = '<project-id>' ORDER BY ports.id ASC) AS anon_1 LEFT 
OUTER JOIN standardattributes AS standardattributes_1 ON 
standardattributes_1.id = anon_1.ports_standard_attr_id LEFT OUTER JOIN 
securitygroupportbindings AS securitygroupportbindings_1 ON anon_1.ports_id = 
securitygroupportbindings_1.port_id LEFT OUTER JOIN portdnses AS portdnses_1 ON 
anon_1.ports_id = portdnses_1.port_id LEFT OUTER JOIN 
qos_network_policy_bindings AS qos_network_policy_bindings_1 ON 
qos_network_policy_bindings_1.network_id = anon_1.ports_network_id LEFT OUTER 
JOIN qos_port_policy_bindings AS qos_port_policy_bindings_1 ON anon_1.ports_id 
= qos_port_policy_bindings_1.port_id LEFT OUTER JOIN ml2_port_bindings AS 
ml2_port_bindings_1 ON anon_1.ports_id = ml2_port_bindings_1.port_id LEFT OUTER 
JOIN portsecuritybindings AS portsecuritybindings_1 ON anon_1.ports_id = 
portsecuritybindings_1.port_id LEFT OUTER JOIN trunks 
 AS trunks_1 ON anon_1.ports_id = trunks_1.port_id LEFT OUTER JOIN 
standardattributes AS standardattributes_2 ON standardattributes_2.id = 
trunks_1.standard_attr_id LEFT OUTER JOIN subports AS subports_1 ON 
anon_1.ports_id = subports_1.port_id LEFT OUTER JOIN portdataplanestatuses AS 
portdataplanestatuses_1 ON anon_1.ports_id = portdataplanestatuses_1.port_id 
LEFT OUTER JOIN portuplinkstatuspropagation AS portuplinkstatuspropagation_1 ON 
anon_1.ports_id = portuplinkstatuspropagation_1.port_id LEFT OUTER JOIN 
portnumaaffinitypolicies AS portnumaaffinitypolicies_1 ON anon_1.ports_id = 
portnumaaffinitypolicies_1.port_id LEFT OUTER JOIN portdeviceprofiles AS 
portdeviceprofiles_1 ON anon_1.ports_id = portdeviceprofiles_1.port_id ORDER BY 
anon_1.ports_id ASC;
- ```
- 
- - Part of the query relevant for the bug is:
- ```
- SELECT DISTINCT ports.project_id AS ports_project_id, ports.id AS ports_id, 
ports.name AS ports_name, ports.network_id AS ports_network_id, 
ports.mac_address AS ports_mac_address, ports.admin_state_up AS 
ports_admin_state_up, ports.status AS ports_status, ports.device_id AS 
ports_device_id, ports.device_owner AS ports_device_owner, ports.ip_allocation 
AS ports_ip_allocation, ports.standard_attr_id AS ports_standard_attr_id 
- FROM ports, networks 
+ SELECT DISTINCT ports.project_id AS ports_project_id, ports.id AS ports_id, 
ports.name AS ports_name, ports.network_id AS ports_network_id, 
ports.mac_address AS ports_mac_address, ports.admin_state_up AS 
ports_admin_state_up, ports.status AS ports_status, ports.device_id AS 
ports_device_id, ports.device_owner AS ports_device_owner, ports.ip_allocation 
AS ports_ip_allocation, ports.standard_attr_id AS ports_standard_attr_id
+ FROM ports, networks
  WHERE ports.project_id = '<project-id>' OR ports.network_id = networks.id AND 
networks.project_id = '<project-id>' ORDER BY ports.id ASC
  ```
  
- - Executing this query responds in about 0.25 seconds <-- Which is the
- problem.
+ 6. Executing the above query responds in about 0.25 seconds <-- Which is
+ the problem.
  
- - Now update this query to use *explicit join* instead of implicit on:
+ 7. Now update this query to use *explicit join* instead of implicit on:
  ```
  SELECT DISTINCT ports.project_id AS ports_project_id, ports.id AS ports_id, 
ports.name AS ports_name, ports.network_id
- AS ports_network_id, ports.mac_address AS ports_mac_address, 
ports.admin_state_up AS ports_admin_state_up, ports.status AS ports_status, 
ports.device_id AS ports_device_id, ports.device_owner AS ports_device_owner, 
ports.ip_allocation AS ports_ip_allocation, ports.standard_attr_id AS 
ports_standard_attr_id  
- FROM ports JOIN networks ON ports.network_id = networks.id  
+ AS ports_network_id, ports.mac_address AS ports_mac_address, 
ports.admin_state_up AS ports_admin_state_up, ports.status AS ports_status, 
ports.device_id AS ports_device_id, ports.device_owner AS ports_device_owner, 
ports.ip_allocation AS ports_ip_allocation, ports.standard_attr_id AS 
ports_standard_attr_id
+ FROM ports JOIN networks ON ports.network_id = networks.id
  WHERE ports.project_id = '<project-id>' AND networks.project_id = 
'<project-id>' ORDER BY ports.id ASC;
  ```
  
- - The response time of this is around 0.2 seconds
+ 8. The response time of this is around 0.2 seconds
  
  
  Version:
  - Openstack version, neutron from trunk. CommitID 
28961c8b76a4b09412825231a3f69374b183aefd
  - Single node devstack on Ubuntu 22.04.02 LTS

** Description changed:

  Listing ports in a project with large number of ports results in
  querying the database which isn't efficient
  
  Steps to reproduce:
  1. Create 2000 ports in 20 different networks(the more the better) in the 
same project.
  2. Enable query log for mysql using `slow_query_log` and setting 
`long_query_time` to 0.1 seconds
  3. Now list the ports using `openstack port list` as non-admin user
- 4. The following query should be logged: 
https://paste.opendev.org/show/819649/
+ 4. The following query should be logged in the `slow_query_log_file`: 
https://paste.opendev.org/show/819649/
  5. Here is part of the query that is relevant for the bug:
  ```
  SELECT DISTINCT ports.project_id AS ports_project_id, ports.id AS ports_id, 
ports.name AS ports_name, ports.network_id AS ports_network_id, 
ports.mac_address AS ports_mac_address, ports.admin_state_up AS 
ports_admin_state_up, ports.status AS ports_status, ports.device_id AS 
ports_device_id, ports.device_owner AS ports_device_owner, ports.ip_allocation 
AS ports_ip_allocation, ports.standard_attr_id AS ports_standard_attr_id
  FROM ports, networks
  WHERE ports.project_id = '<project-id>' OR ports.network_id = networks.id AND 
networks.project_id = '<project-id>' ORDER BY ports.id ASC
  ```
  
  6. Executing the above query responds in about 0.25 seconds <-- Which is
  the problem.
  
  7. Now update this query to use *explicit join* instead of implicit on:
  ```
  SELECT DISTINCT ports.project_id AS ports_project_id, ports.id AS ports_id, 
ports.name AS ports_name, ports.network_id
  AS ports_network_id, ports.mac_address AS ports_mac_address, 
ports.admin_state_up AS ports_admin_state_up, ports.status AS ports_status, 
ports.device_id AS ports_device_id, ports.device_owner AS ports_device_owner, 
ports.ip_allocation AS ports_ip_allocation, ports.standard_attr_id AS 
ports_standard_attr_id
  FROM ports JOIN networks ON ports.network_id = networks.id
  WHERE ports.project_id = '<project-id>' AND networks.project_id = 
'<project-id>' ORDER BY ports.id ASC;
  ```
  
  8. The response time of this is around 0.2 seconds
  
- 
  Version:
  - Openstack version, neutron from trunk. CommitID 
28961c8b76a4b09412825231a3f69374b183aefd
  - Single node devstack on Ubuntu 22.04.02 LTS

-- 
You received this bug notification because you are a member of Yahoo!
Engineering Team, which is subscribed to neutron.
https://bugs.launchpad.net/bugs/2016704

Title:
  Listing ports creates inefficient database query

Status in neutron:
  New

Bug description:
  Listing ports in a project with large number of ports results in
  querying the database which isn't efficient

  Steps to reproduce:
  1. Create 2000 ports in 20 different networks(the more the better) in the 
same project.
  2. Enable query log for mysql using `slow_query_log` and setting 
`long_query_time` to 0.1 seconds
  3. Now list the ports using `openstack port list` as non-admin user
  4. The following query should be logged in the `slow_query_log_file`: 
https://paste.opendev.org/show/819649/
  5. Here is part of the query that is relevant for the bug:
  ```
  SELECT DISTINCT ports.project_id AS ports_project_id, ports.id AS ports_id, 
ports.name AS ports_name, ports.network_id AS ports_network_id, 
ports.mac_address AS ports_mac_address, ports.admin_state_up AS 
ports_admin_state_up, ports.status AS ports_status, ports.device_id AS 
ports_device_id, ports.device_owner AS ports_device_owner, ports.ip_allocation 
AS ports_ip_allocation, ports.standard_attr_id AS ports_standard_attr_id
  FROM ports, networks
  WHERE ports.project_id = '<project-id>' OR ports.network_id = networks.id AND 
networks.project_id = '<project-id>' ORDER BY ports.id ASC
  ```

  6. Executing the above query responds in about 0.25 seconds <-- Which
  is the problem.

  7. Now update this query to use *explicit join* instead of implicit on:
  ```
  SELECT DISTINCT ports.project_id AS ports_project_id, ports.id AS ports_id, 
ports.name AS ports_name, ports.network_id
  AS ports_network_id, ports.mac_address AS ports_mac_address, 
ports.admin_state_up AS ports_admin_state_up, ports.status AS ports_status, 
ports.device_id AS ports_device_id, ports.device_owner AS ports_device_owner, 
ports.ip_allocation AS ports_ip_allocation, ports.standard_attr_id AS 
ports_standard_attr_id
  FROM ports JOIN networks ON ports.network_id = networks.id
  WHERE ports.project_id = '<project-id>' AND networks.project_id = 
'<project-id>' ORDER BY ports.id ASC;
  ```

  8. The response time of this is around 0.2 seconds

  Version:
  - Openstack version, neutron from trunk. CommitID 
28961c8b76a4b09412825231a3f69374b183aefd
  - Single node devstack on Ubuntu 22.04.02 LTS

To manage notifications about this bug go to:
https://bugs.launchpad.net/neutron/+bug/2016704/+subscriptions


-- 
Mailing list: https://launchpad.net/~yahoo-eng-team
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~yahoo-eng-team
More help   : https://help.launchpad.net/ListHelp

Reply via email to