summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGary Kotton <gkotton@vmware.com>2015-04-15 05:14:42 -0700
committerGary Kotton <gkotton@vmware.com>2015-04-20 04:34:57 -0700
commit389368bcfe498323b369f68682babb92a5b0ca54 (patch)
treed755107ae17a27878c1f1b4ad5369ef1d1015300
parent22d7547c6b62fb9dabd861e4941edd34eedabfc6 (diff)
downloadnova-389368bcfe498323b369f68682babb92a5b0ca54.tar.gz
Resource tracker: unable to restart nova compute
The resource tracker calculates its used resources. In certain cases of failed migrations and an instance being deleted the resource tracker causes an exception in nova compute. If this situation arises then nova compute may not even be able to restart. Change-Id: I4a154e0cae3b8e22bd59ed05ba708e07eed8dea7 Closes-bug: #1444439 (cherry picked from commit ee7a7446cc6947a6bacacb6cb514934cc22e5782)
-rw-r--r--nova/compute/resource_tracker.py7
-rw-r--r--nova/tests/unit/compute/test_resource_tracker.py12
2 files changed, 16 insertions, 3 deletions
diff --git a/nova/compute/resource_tracker.py b/nova/compute/resource_tracker.py
index 7ef8ea5020..747985ea9b 100644
--- a/nova/compute/resource_tracker.py
+++ b/nova/compute/resource_tracker.py
@@ -705,10 +705,11 @@ class ResourceTracker(object):
# do some defensive filtering against bad migrations records in the
# database:
for migration in migrations:
- instance = migration.instance
-
- if not instance:
+ try:
+ instance = migration.instance
+ except exception.InstanceNotFound as e:
# migration referencing deleted instance
+ LOG.debug('Migration instance not found: %s', e)
continue
uuid = instance.uuid
diff --git a/nova/tests/unit/compute/test_resource_tracker.py b/nova/tests/unit/compute/test_resource_tracker.py
index 295b1dea97..73c8d32c19 100644
--- a/nova/tests/unit/compute/test_resource_tracker.py
+++ b/nova/tests/unit/compute/test_resource_tracker.py
@@ -1084,6 +1084,18 @@ class InstanceClaimTestCase(BaseTrackerTestCase):
self.assertEqual(0, self.tracker.compute_node['memory_mb_used'])
self.assertEqual(0, self.tracker.compute_node['local_gb_used'])
+ @mock.patch('nova.objects.MigrationList.get_in_progress_by_host_and_node')
+ def test_deleted_instances_with_migrations(self, mock_migration_list):
+ migration = objects.Migration(context=self.context,
+ instance_uuid='invalid')
+ mock_migration_list.return_value = [migration]
+ self.tracker.update_available_resource(self.context)
+ self.assertEqual(0, self.tracker.compute_node['memory_mb_used'])
+ self.assertEqual(0, self.tracker.compute_node['local_gb_used'])
+ mock_migration_list.assert_called_once_with(self.context,
+ "fakehost",
+ "fakenode")
+
class ResizeClaimTestCase(BaseTrackerTestCase):