From d61e15818c1d108275b3286a6665fa3e6540e7e7 Mon Sep 17 00:00:00 2001 From: Rajesh Tailor Date: Thu, 2 Jul 2015 03:22:01 -0700 Subject: [PATCH] Set migration status to 'error' on live-migration failure (A) In resize, confirm-resize and revert-resize operation, migration status is marked as 'error' in case of failure for respective operation. Migration object support is added in live-migration operation, which mark migration status to 'failed' if live-migration operation fails in-between. To make live-migration consistent with resize, confirm-resize and revert- resize operation, it needs to mark migration status to 'error' instead of 'failed' in case of failure. (B) Apart from consistency, proposed change fixes issue (similar to [1]) which might occur on live-migration failure as follows: If live-migration fails (which sets migration status to 'failed') after copying instance files from source to dest node and then user request for instance deletion. In that case, delete api will only remove instance files from instance.host and not from other host (which could be either source or dest node but not instance.host). Since instance is already deleted, instance files will remain on other host (not instance.host). Set migration status to 'error' on live-migration failure, so that periodic task _cleanup_incomplete_migrations [2] will remove orphaned instance files from compute nodes after instance deletion in above case. [1] https://bugs.launchpad.net/nova/+bug/1392527 [2] https://review.openstack.org/#/c/219299/ DocImpact: On live-migration failure, set migration status to 'error' instead of 'failed'. Change-Id: I7a0c5a32349b0d3604802d22e83a3c2dab4b1370 Closes-Bug: 1470420 --- nova/compute/manager.py | 4 ++-- nova/conductor/manager.py | 2 +- nova/tests/unit/compute/test_compute.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/nova/compute/manager.py b/nova/compute/manager.py index a78d0fe7d9c6..1910b7bc5290 100644 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -5107,7 +5107,7 @@ class ComputeManager(manager.Manager): with excutils.save_and_reraise_exception(): LOG.exception(_LE('Pre live migration failed at %s'), dest, instance=instance) - self._set_migration_status(migration, 'failed') + self._set_migration_status(migration, 'error') self._rollback_live_migration(context, instance, dest, block_migration, migrate_data) @@ -5127,7 +5127,7 @@ class ComputeManager(manager.Manager): # nothing must be recovered in this version. LOG.exception(_LE('Live migration failed.'), instance=instance) with excutils.save_and_reraise_exception(): - self._set_migration_status(migration, 'failed') + self._set_migration_status(migration, 'error') @wrap_exception() @wrap_instance_event diff --git a/nova/conductor/manager.py b/nova/conductor/manager.py index b63bcb34f338..76e30ac1228f 100644 --- a/nova/conductor/manager.py +++ b/nova/conductor/manager.py @@ -333,7 +333,7 @@ class ComputeTaskManager(base.Base): exc_info=True) _set_vm_state(context, instance, ex, vm_states.ERROR, instance.task_state) - migration.status = 'failed' + migration.status = 'error' migration.save() raise exception.MigrationError(reason=six.text_type(ex)) diff --git a/nova/tests/unit/compute/test_compute.py b/nova/tests/unit/compute/test_compute.py index 3474dac81196..77b211b42e61 100644 --- a/nova/tests/unit/compute/test_compute.py +++ b/nova/tests/unit/compute/test_compute.py @@ -5595,7 +5595,7 @@ class ComputeTestCase(BaseTestCase): self.assertEqual('src_host', instance.host) self.assertEqual(vm_states.ACTIVE, instance.vm_state) self.assertIsNone(instance.task_state) - self.assertEqual('failed', migration.status) + self.assertEqual('error', migration.status) @mock.patch.object(compute_utils, 'EventReporter') @mock.patch('nova.objects.Migration.save')