summaryrefslogtreecommitdiffstats
path: root/nova/compute
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2013-03-04 17:04:36 +0000
committerGerrit Code Review <review@openstack.org>2013-03-04 17:04:36 +0000
commitbcdbe9ba881db8b38525bfc44a182e6b210459cd (patch)
tree5a2333a8418dee0e5b654172d2843f6116323d73 /nova/compute
parent8f3a7f73ffad0c64b89e926e2a672f8333da3636 (diff)
parentac0f6eb063fc5a5c0a9410402ecf57fae1faf594 (diff)
downloadnova-bcdbe9ba881db8b38525bfc44a182e6b210459cd.tar.gz
nova-bcdbe9ba881db8b38525bfc44a182e6b210459cd.tar.xz
nova-bcdbe9ba881db8b38525bfc44a182e6b210459cd.zip
Merge "Compute manager should remove dead resources"
Diffstat (limited to 'nova/compute')
-rwxr-xr-xnova/compute/manager.py9
-rw-r--r--nova/compute/resource_tracker.py23
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: