From 69eca4c60d762b673fafb13dd12f285d7f1f1239 Mon Sep 17 00:00:00 2001 From: Paul Murray Date: Mon, 23 Nov 2015 14:50:14 +0000 Subject: [PATCH] Fix resource tracker VCPU counting The resource track is double counting the number of vcpus used because it counts the virt driver's view and the resource tracker's view. It should reset the count to 0 before counting the resourcet racker's view. this is done for other resources (memory, disk) in _update_usage_from_instances(). This was not caught in unit tests because they always provide a virt driver view with no resource used for tests that assume instances are already running. This patch adds the reset to 0 and modifies the tests to provide correct counts of used resources from the virt driver. Change-Id: I21acfd7d5b5ed442cd1e9049c986a06bd2b59b81 Closes-Bug: #1519001 --- nova/compute/resource_tracker.py | 1 + nova/tests/unit/compute/test_tracker.py | 52 ++++++++++++++++++++++--- 2 files changed, 47 insertions(+), 6 deletions(-) diff --git a/nova/compute/resource_tracker.py b/nova/compute/resource_tracker.py index e74c2e7d7d76..2b26ea0b4022 100644 --- a/nova/compute/resource_tracker.py +++ b/nova/compute/resource_tracker.py @@ -862,6 +862,7 @@ class ResourceTracker(object): # set some initial values, reserve room for host/hypervisor: self.compute_node.local_gb_used = CONF.reserved_host_disk_mb / 1024 self.compute_node.memory_mb_used = CONF.reserved_host_memory_mb + self.compute_node.vcpus_used = 0 self.compute_node.free_ram_mb = (self.compute_node.memory_mb - self.compute_node.memory_mb_used) self.compute_node.free_disk_gb = (self.compute_node.local_gb - diff --git a/nova/tests/unit/compute/test_tracker.py b/nova/tests/unit/compute/test_tracker.py index 54312be74ee1..ac6aa310ab8e 100644 --- a/nova/tests/unit/compute/test_tracker.py +++ b/nova/tests/unit/compute/test_tracker.py @@ -538,7 +538,14 @@ class TestUpdateAvailableResources(BaseTestCase): get_cn_mock): self.flags(reserved_host_disk_mb=0, reserved_host_memory_mb=0) - self._setup_rt() + + # Setup virt resources to match used resources to number + # of defined instances on the hypervisor + virt_resources = copy.deepcopy(_VIRT_DRIVER_AVAIL_RESOURCES) + virt_resources.update(vcpus_used=1, + memory_mb_used=128, + local_gb_used=1) + self._setup_rt(virt_resources=virt_resources) get_mock.return_value = _INSTANCE_FIXTURES migr_mock.return_value = [] @@ -583,7 +590,12 @@ class TestUpdateAvailableResources(BaseTestCase): get_cn_mock): self.flags(reserved_host_disk_mb=0, reserved_host_memory_mb=0) - self._setup_rt() + + # Setup virt resources to match used resources to number + # of defined instances on the hypervisor + virt_resources = copy.deepcopy(_VIRT_DRIVER_AVAIL_RESOURCES) + virt_resources.update(memory_mb_used=64) + self._setup_rt(virt_resources=virt_resources) get_mock.return_value = [] migr_mock.return_value = [] @@ -660,7 +672,14 @@ class TestUpdateAvailableResources(BaseTestCase): # node in case of a revert of the resize. self.flags(reserved_host_disk_mb=0, reserved_host_memory_mb=0) - self._setup_rt() + + # Setup virt resources to match used resources to number + # of defined instances on the hypervisor + virt_resources = copy.deepcopy(_VIRT_DRIVER_AVAIL_RESOURCES) + virt_resources.update(vcpus_used=4, + memory_mb_used=128, + local_gb_used=1) + self._setup_rt(virt_resources=virt_resources) get_mock.return_value = [] migr_obj = _MIGRATION_FIXTURES['source-only'] @@ -723,7 +742,14 @@ class TestUpdateAvailableResources(BaseTestCase): # node in case of a confirm of the resize. self.flags(reserved_host_disk_mb=0, reserved_host_memory_mb=0) - self._setup_rt() + + # Setup virt resources to match used resources to number + # of defined instances on the hypervisor + virt_resources = copy.deepcopy(_VIRT_DRIVER_AVAIL_RESOURCES) + virt_resources.update(vcpus_used=2, + memory_mb_used=256, + local_gb_used=5) + self._setup_rt(virt_resources=virt_resources) get_mock.return_value = [] migr_obj = _MIGRATION_FIXTURES['dest-only'] @@ -780,7 +806,14 @@ class TestUpdateAvailableResources(BaseTestCase): # is in progress, but not finished yet. self.flags(reserved_host_disk_mb=0, reserved_host_memory_mb=0) - self._setup_rt() + + # Setup virt resources to match used resources to number + # of defined instances on the hypervisor + virt_resources = copy.deepcopy(_VIRT_DRIVER_AVAIL_RESOURCES) + virt_resources.update(vcpus_used=2, + memory_mb_used=256, + local_gb_used=5) + self._setup_rt(virt_resources=virt_resources) get_mock.return_value = [] migr_obj = _MIGRATION_FIXTURES['dest-only-evac'] @@ -842,7 +875,14 @@ class TestUpdateAvailableResources(BaseTestCase): # resize instance types as taking up space on the node. self.flags(reserved_host_disk_mb=0, reserved_host_memory_mb=0) - self._setup_rt() + + # Setup virt resources to match used resources to number + # of defined instances on the hypervisor + virt_resources = copy.deepcopy(_VIRT_DRIVER_AVAIL_RESOURCES) + virt_resources.update(vcpus_used=4, + memory_mb_used=512, + local_gb_used=7) + self._setup_rt(virt_resources=virt_resources) migr_obj = _MIGRATION_FIXTURES['source-and-dest'] migr_mock.return_value = [migr_obj]