summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohannes Erdfelt <johannes.erdfelt@rackspace.com>2012-10-02 17:55:00 +0000
committerJohannes Erdfelt <johannes.erdfelt@rackspace.com>2012-10-02 17:55:00 +0000
commit6bc8c20be705f3cf704b5103e8bb998015d14248 (patch)
tree2bd585d32c61826c2781184014f0a0e42356d3f0
parent0291266fb61dd398147fa2ae1a37366dd2fa869e (diff)
downloadnova-6bc8c20be705f3cf704b5103e8bb998015d14248.tar.gz
nova-6bc8c20be705f3cf704b5103e8bb998015d14248.tar.xz
nova-6bc8c20be705f3cf704b5103e8bb998015d14248.zip
Make resource tracker uses faster DB query
Fixes bug 1060363 db.instance_get_all_by_filters() uses a regex when filtering on host, which will do a full table scan. A regex isn't needed and instead, db.instance_get_all_by_host() can be used which does not impact the performance so much. Change-Id: I812e1d5320763e5c65232351e1e21285e04e6a4b
-rw-r--r--nova/compute/resource_tracker.py3
-rw-r--r--nova/tests/compute/test_compute.py24
-rw-r--r--nova/tests/compute/test_resource_tracker.py7
3 files changed, 19 insertions, 15 deletions
diff --git a/nova/compute/resource_tracker.py b/nova/compute/resource_tracker.py
index eb0d302b0..e5e1194a5 100644
--- a/nova/compute/resource_tracker.py
+++ b/nova/compute/resource_tracker.py
@@ -379,8 +379,7 @@ class ResourceTracker(object):
self._purge_expired_claims()
# Grab all instances assigned to this host:
- filters = {'host': self.host, 'deleted': False}
- instances = db.instance_get_all_by_filters(context, filters)
+ instances = db.instance_get_all_by_host(context, self.host)
# Now calculate usage based on instance utilization:
self._update_usage_from_instances(resources, instances)
diff --git a/nova/tests/compute/test_compute.py b/nova/tests/compute/test_compute.py
index bb7a9a637..048c8414b 100644
--- a/nova/tests/compute/test_compute.py
+++ b/nova/tests/compute/test_compute.py
@@ -279,7 +279,8 @@ class ComputeTestCase(BaseTestCase):
def test_create_instance_unlimited_memory(self):
"""Default of memory limit=None is unlimited"""
self.flags(reserved_host_disk_mb=0, reserved_host_memory_mb=0)
- self.compute.resource_tracker.update_available_resource(self.context)
+ self.compute.resource_tracker.update_available_resource(
+ self.context.elevated())
params = {"memory_mb": 999999999999}
filter_properties = {'limits': {'memory_mb': None}}
instance = self._create_fake_instance(params)
@@ -290,7 +291,8 @@ class ComputeTestCase(BaseTestCase):
def test_create_instance_unlimited_disk(self):
self.flags(reserved_host_disk_mb=0, reserved_host_memory_mb=0)
- self.compute.resource_tracker.update_available_resource(self.context)
+ self.compute.resource_tracker.update_available_resource(
+ self.context.elevated())
params = {"root_gb": 999999999999,
"ephemeral_gb": 99999999999}
filter_properties = {'limits': {'disk_gb': None}}
@@ -300,7 +302,8 @@ class ComputeTestCase(BaseTestCase):
def test_create_multiple_instances_then_starve(self):
self.flags(reserved_host_disk_mb=0, reserved_host_memory_mb=0)
- self.compute.resource_tracker.update_available_resource(self.context)
+ self.compute.resource_tracker.update_available_resource(
+ self.context.elevated())
filter_properties = {'limits': {'memory_mb': 4096, 'disk_gb': 1000}}
params = {"memory_mb": 1024, "root_gb": 128, "ephemeral_gb": 128}
instance = self._create_fake_instance(params)
@@ -330,7 +333,8 @@ class ComputeTestCase(BaseTestCase):
"""Test passing of oversubscribed ram policy from the scheduler."""
self.flags(reserved_host_disk_mb=0, reserved_host_memory_mb=0)
- self.compute.resource_tracker.update_available_resource(self.context)
+ self.compute.resource_tracker.update_available_resource(
+ self.context.elevated())
# get total memory as reported by virt driver:
resources = self.compute.driver.get_available_resource()
@@ -358,7 +362,8 @@ class ComputeTestCase(BaseTestCase):
with insufficient memory.
"""
self.flags(reserved_host_disk_mb=0, reserved_host_memory_mb=0)
- self.compute.resource_tracker.update_available_resource(self.context)
+ self.compute.resource_tracker.update_available_resource(
+ self.context.elevated())
# get total memory as reported by virt driver:
resources = self.compute.driver.get_available_resource()
@@ -383,7 +388,8 @@ class ComputeTestCase(BaseTestCase):
"""Test passing of oversubscribed cpu policy from the scheduler."""
self.flags(reserved_host_disk_mb=0, reserved_host_memory_mb=0)
- self.compute.resource_tracker.update_available_resource(self.context)
+ self.compute.resource_tracker.update_available_resource(
+ self.context.elevated())
limits = {'vcpu': 3}
filter_properties = {'limits': limits}
@@ -435,7 +441,8 @@ class ComputeTestCase(BaseTestCase):
"""Test passing of oversubscribed disk policy from the scheduler."""
self.flags(reserved_host_disk_mb=0, reserved_host_memory_mb=0)
- self.compute.resource_tracker.update_available_resource(self.context)
+ self.compute.resource_tracker.update_available_resource(
+ self.context.elevated())
# get total memory as reported by virt driver:
resources = self.compute.driver.get_available_resource()
@@ -462,7 +469,8 @@ class ComputeTestCase(BaseTestCase):
with insufficient disk.
"""
self.flags(reserved_host_disk_mb=0, reserved_host_memory_mb=0)
- self.compute.resource_tracker.update_available_resource(self.context)
+ self.compute.resource_tracker.update_available_resource(
+ self.context.elevated())
# get total memory as reported by virt driver:
resources = self.compute.driver.get_available_resource()
diff --git a/nova/tests/compute/test_resource_tracker.py b/nova/tests/compute/test_resource_tracker.py
index 81b2be130..04b2dfdba 100644
--- a/nova/tests/compute/test_resource_tracker.py
+++ b/nova/tests/compute/test_resource_tracker.py
@@ -84,8 +84,8 @@ class BaseTestCase(test.TestCase):
self.context = FakeContext()
self._instances = []
- self.stubs.Set(db, 'instance_get_all_by_filters',
- self._fake_instance_get_all_by_filters)
+ self.stubs.Set(db, 'instance_get_all_by_host',
+ lambda c, h: self._instances)
def _create_compute_node(self, values=None):
compute = {
@@ -139,9 +139,6 @@ class BaseTestCase(test.TestCase):
self._instances.append(instance)
return instance
- def _fake_instance_get_all_by_filters(self, ctx, filters, **kwargs):
- return self._instances
-
def _tracker(self, unsupported=False):
host = "fakehost"