From 6bc8c20be705f3cf704b5103e8bb998015d14248 Mon Sep 17 00:00:00 2001 From: Johannes Erdfelt Date: Tue, 2 Oct 2012 17:55:00 +0000 Subject: 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 --- nova/compute/resource_tracker.py | 3 +-- nova/tests/compute/test_compute.py | 24 ++++++++++++++++-------- nova/tests/compute/test_resource_tracker.py | 7 ++----- 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" -- cgit