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
(cherry picked from commit d61e15818c)
This commit is contained in:
Rajesh Tailor 2015-07-02 03:22:01 -07:00 committed by Abhishek Kekane
parent 67cfb16a4f
commit 8825efa3b2
3 changed files with 4 additions and 4 deletions

View File

@ -5286,7 +5286,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)
@ -5306,7 +5306,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

View File

@ -335,7 +335,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))

View File

@ -5596,7 +5596,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')