diff options
author | Gary Kotton <gkotton@vmware.com> | 2015-04-15 05:14:42 -0700 |
---|---|---|
committer | Gary Kotton <gkotton@vmware.com> | 2015-04-20 04:34:57 -0700 |
commit | 389368bcfe498323b369f68682babb92a5b0ca54 (patch) | |
tree | d755107ae17a27878c1f1b4ad5369ef1d1015300 | |
parent | 22d7547c6b62fb9dabd861e4941edd34eedabfc6 (diff) | |
download | nova-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.py | 7 | ||||
-rw-r--r-- | nova/tests/unit/compute/test_resource_tracker.py | 12 |
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): |