diff options
| author | Johannes Erdfelt <johannes.erdfelt@rackspace.com> | 2012-10-02 17:55:00 +0000 |
|---|---|---|
| committer | Johannes Erdfelt <johannes.erdfelt@rackspace.com> | 2012-10-02 17:55:00 +0000 |
| commit | 6bc8c20be705f3cf704b5103e8bb998015d14248 (patch) | |
| tree | 2bd585d32c61826c2781184014f0a0e42356d3f0 | |
| parent | 0291266fb61dd398147fa2ae1a37366dd2fa869e (diff) | |
| download | nova-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.py | 3 | ||||
| -rw-r--r-- | nova/tests/compute/test_compute.py | 24 | ||||
| -rw-r--r-- | 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" |
