Bypass the database if limit=0 for server-list requests
Not all database engines handle fetching 0 rows the same and there isn't really a point in going to the database to return nothing, so bypass the DB query if limit=0. The Nova API is explicitly checking if limit >= 0 so we can't make any changes there since they would be backwards incompatible, i.e. to start enforcing limit > 0. Closes-Bug: #1296929 Change-Id: Ib3d0318bec972af5f1f25202101e76066f930f34
This commit is contained in:
@@ -1850,6 +1850,10 @@ def instance_get_all_by_filters(context, filters, sort_key, sort_dir,
|
|||||||
include or exclude instances whose
|
include or exclude instances whose
|
||||||
vm_state is SOFT_DELETED.
|
vm_state is SOFT_DELETED.
|
||||||
"""
|
"""
|
||||||
|
# NOTE(mriedem): If the limit is 0 there is no point in even going
|
||||||
|
# to the database since nothing is going to be returned anyway.
|
||||||
|
if limit == 0:
|
||||||
|
return []
|
||||||
|
|
||||||
sort_fn = {'desc': desc, 'asc': asc}
|
sort_fn = {'desc': desc, 'asc': asc}
|
||||||
|
|
||||||
|
|||||||
@@ -1542,6 +1542,11 @@ class InstanceTestCase(test.TestCase, ModelsObjectComparatorMixin):
|
|||||||
filtered_instances = db.instance_get_all_by_filters(self.ctxt, {})
|
filtered_instances = db.instance_get_all_by_filters(self.ctxt, {})
|
||||||
self._assertEqualListsOfInstances(instances, filtered_instances)
|
self._assertEqualListsOfInstances(instances, filtered_instances)
|
||||||
|
|
||||||
|
def test_instance_get_all_by_filters_zero_limit(self):
|
||||||
|
self.create_instance_with_args()
|
||||||
|
instances = db.instance_get_all_by_filters(self.ctxt, {}, limit=0)
|
||||||
|
self.assertEqual([], instances)
|
||||||
|
|
||||||
def test_instance_metadata_get_multi(self):
|
def test_instance_metadata_get_multi(self):
|
||||||
uuids = [self.create_instance_with_args()['uuid'] for i in range(3)]
|
uuids = [self.create_instance_with_args()['uuid'] for i in range(3)]
|
||||||
meta = sqlalchemy_api._instance_metadata_get_multi(self.ctxt, uuids)
|
meta = sqlalchemy_api._instance_metadata_get_multi(self.ctxt, uuids)
|
||||||
|
|||||||
Reference in New Issue
Block a user