Avoid unnecessary joins in delete_resource_provider

If cascade=True, we're getting all of the instances on the
compute node just to use the uuid, which will by default
join on the info_cache and security_groups for the instances.
This is a simple optimization to avoid those unnecessary joins.

A TODO is left to further optimize this with a new InstanceList
query method to just get the instance uuids on a given host/node
combo, but that requires an RPC change which we can't backport.

Change-Id: Ie121210456a240c257979d3269db115ddae2d23b
Related-Bug: #1811726
Related-Bug: #1756179
This commit is contained in:
Matt Riedemann 2019-05-03 15:40:30 -04:00
parent 650fe118d1
commit 8921a470ee
2 changed files with 8 additions and 2 deletions

View File

@ -2169,8 +2169,12 @@ class SchedulerReportClient(object):
# Delete any allocations for this resource provider. # Delete any allocations for this resource provider.
# Since allocations are by consumer, we get the consumers on this # Since allocations are by consumer, we get the consumers on this
# host, which are its instances. # host, which are its instances.
instances = objects.InstanceList.get_by_host_and_node(context, # TODO(mriedem): Optimize this up by adding an
host, nodename) # InstanceList.get_uuids_by_host_and_node method.
# Pass expected_attrs=[] to avoid joining on extra columns we
# don't use.
instances = objects.InstanceList.get_by_host_and_node(
context, host, nodename, expected_attrs=[])
for instance in instances: for instance in instances:
self.delete_allocation_for_instance(context, instance.uuid) self.delete_allocation_for_instance(context, instance.uuid)
try: try:

View File

@ -3201,6 +3201,8 @@ class TestAllocations(SchedulerReportClientTestCase):
resp_mock = mock.Mock(status_code=204) resp_mock = mock.Mock(status_code=204)
mock_delete.return_value = resp_mock mock_delete.return_value = resp_mock
self.client.delete_resource_provider(self.context, cn, cascade=True) self.client.delete_resource_provider(self.context, cn, cascade=True)
mock_by_host.assert_called_once_with(
self.context, cn.host, cn.hypervisor_hostname, expected_attrs=[])
self.assertEqual(2, mock_del_alloc.call_count) self.assertEqual(2, mock_del_alloc.call_count)
exp_url = "/resource_providers/%s" % uuids.cn exp_url = "/resource_providers/%s" % uuids.cn
mock_delete.assert_called_once_with( mock_delete.assert_called_once_with(