diff options
author | Jenkins <jenkins@review.openstack.org> | 2013-03-04 17:04:36 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2013-03-04 17:04:36 +0000 |
commit | bcdbe9ba881db8b38525bfc44a182e6b210459cd (patch) | |
tree | 5a2333a8418dee0e5b654172d2843f6116323d73 /nova/compute | |
parent | 8f3a7f73ffad0c64b89e926e2a672f8333da3636 (diff) | |
parent | ac0f6eb063fc5a5c0a9410402ecf57fae1faf594 (diff) | |
download | nova-bcdbe9ba881db8b38525bfc44a182e6b210459cd.tar.gz nova-bcdbe9ba881db8b38525bfc44a182e6b210459cd.tar.xz nova-bcdbe9ba881db8b38525bfc44a182e6b210459cd.zip |
Merge "Compute manager should remove dead resources"
Diffstat (limited to 'nova/compute')
-rwxr-xr-x | nova/compute/manager.py | 9 | ||||
-rw-r--r-- | nova/compute/resource_tracker.py | 23 |
2 files changed, 25 insertions, 7 deletions
diff --git a/nova/compute/manager.py b/nova/compute/manager.py index 346d957d2..d9e8435cc 100755 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -3676,11 +3676,18 @@ class ComputeManager(manager.SchedulerDependentManager): :param context: security context """ new_resource_tracker_dict = {} - nodenames = self.driver.get_available_nodes() + nodenames = set(self.driver.get_available_nodes()) for nodename in nodenames: rt = self._get_resource_tracker(nodename) rt.update_available_resource(context) new_resource_tracker_dict[nodename] = rt + + # delete nodes that the driver no longer reports + known_nodes = set(self._resource_tracker_dict.keys()) + for nodename in known_nodes - nodenames: + rt = self._get_resource_tracker(nodename) + rt.update_available_resource(context, delete=True) + self._resource_tracker_dict = new_resource_tracker_dict @manager.periodic_task(spacing=CONF.running_deleted_instance_poll_interval) diff --git a/nova/compute/resource_tracker.py b/nova/compute/resource_tracker.py index 42000fcb9..fab64017d 100644 --- a/nova/compute/resource_tracker.py +++ b/nova/compute/resource_tracker.py @@ -226,7 +226,7 @@ class ResourceTracker(object): return self.compute_node is None @lockutils.synchronized(COMPUTE_RESOURCE_SEMAPHORE, 'nova-') - def update_available_resource(self, context): + def update_available_resource(self, context, delete=False): """Override in-memory calculations of compute node resource usage based on data audited from the hypervisor layer. @@ -237,11 +237,15 @@ class ResourceTracker(object): LOG.audit(_("Auditing locally available compute resources")) resources = self.driver.get_available_resource(self.nodename) if not resources: - # The virt driver does not support this function - LOG.audit(_("Virt driver does not support " - "'get_available_resource' Compute tracking is disabled.")) - self.compute_node = None - return + if delete: + self._delete_compute_node(context) + return + else: + # The virt driver does not support this function + LOG.audit(_("Virt driver does not support " + "'get_available_resource' Compute tracking is disabled.")) + self.compute_node = None + return self._verify_resources(resources) @@ -270,6 +274,13 @@ class ResourceTracker(object): self._sync_compute_node(context, resources) + def _delete_compute_node(self, context): + """Delete a compute node DB record.""" + if self.compute_node: + LOG.audit(_("Deleting compute node %s") % self.compute_node['id']) + self.compute_node = self.conductor_api.compute_node_delete( + context, self.compute_node) + def _sync_compute_node(self, context, resources): """Create or update the compute node DB record.""" if not self.compute_node: |