Don't make a no-op DB call
drivers_uuid can be empty, but we are still doing a DB call. This is causing
a sqlalchemy SAWarning.
SAWarning: The IN-predicate on "instances.uuid" was invoked with an
empty sequence. This results in a contradiction, which nonetheless can
be expensive to evaluate. Consider alternative strategies for improved
performance.
Conflicts:
nova/tests/unit/compute/test_compute_mgr.py
Change-Id: Ib8c9b85e84800c9e2ddcdf204851f1b51101926c
Closes-Bug: #1383617
(cherry picked from commit 150428f76e
)
This commit is contained in:
parent
54330ce33e
commit
699b46799f
|
@ -691,6 +691,9 @@ class ComputeManager(manager.Manager):
|
||||||
filters = {}
|
filters = {}
|
||||||
try:
|
try:
|
||||||
driver_uuids = self.driver.list_instance_uuids()
|
driver_uuids = self.driver.list_instance_uuids()
|
||||||
|
if len(driver_uuids) == 0:
|
||||||
|
# Short circuit, don't waste a DB call
|
||||||
|
return objects.InstanceList()
|
||||||
filters['uuid'] = driver_uuids
|
filters['uuid'] = driver_uuids
|
||||||
local_instances = objects.InstanceList.get_by_filters(
|
local_instances = objects.InstanceList.get_by_filters(
|
||||||
context, filters, use_slave=True)
|
context, filters, use_slave=True)
|
||||||
|
|
|
@ -813,6 +813,18 @@ class ComputeManagerUnitTestCase(test.NoDBTestCase):
|
||||||
self.assertEqual([x['uuid'] for x in driver_instances],
|
self.assertEqual([x['uuid'] for x in driver_instances],
|
||||||
[x['uuid'] for x in result])
|
[x['uuid'] for x in result])
|
||||||
|
|
||||||
|
@mock.patch('nova.virt.driver.ComputeDriver.list_instance_uuids')
|
||||||
|
@mock.patch('nova.db.api.instance_get_all_by_filters')
|
||||||
|
def test_get_instances_on_driver_empty(self, mock_list, mock_db):
|
||||||
|
fake_context = context.get_admin_context()
|
||||||
|
mock_list.return_value = []
|
||||||
|
|
||||||
|
result = self.compute._get_instances_on_driver(fake_context)
|
||||||
|
# instance_get_all_by_filters should not be called
|
||||||
|
self.assertEqual(0, mock_db.call_count)
|
||||||
|
self.assertEqual([],
|
||||||
|
[x['uuid'] for x in result])
|
||||||
|
|
||||||
def test_get_instances_on_driver_fallback(self):
|
def test_get_instances_on_driver_fallback(self):
|
||||||
# Test getting instances when driver doesn't support
|
# Test getting instances when driver doesn't support
|
||||||
# 'list_instance_uuids'
|
# 'list_instance_uuids'
|
||||||
|
|
Loading…
Reference in New Issue