From 985d703d2731fe9ec968ef6698bbf39743ede32a Mon Sep 17 00:00:00 2001 From: Dan Smith Date: Tue, 26 Mar 2013 13:14:56 -0700 Subject: Always store old instance_type during a migration Previously, we were trying to optimize for the migration (as opposed to resize) case by not storing the old_ instance_type. However, this is confusing to the vast amount of shared code that works on migrations and resizes because the "is old == new" logic must be replicated everywhere. To cut our losses and hopefully avoid other hidden dragons, this patch removes the optimization and makes both paths the same. Fixes bug #1160489 Change-Id: I2ad7b02239baada5fd2174f5b61cdc90ec91e6f5 --- nova/compute/manager.py | 25 ++++++++++--------------- nova/tests/compute/test_compute.py | 7 +++---- 2 files changed, 13 insertions(+), 19 deletions(-) diff --git a/nova/compute/manager.py b/nova/compute/manager.py index 8798e4aee..6cb0bbb94 100755 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -1989,11 +1989,8 @@ class ComputeManager(manager.SchedulerDependentManager): Returns the updated system_metadata as a dict, as well as the post-cleanup current instance type. """ - same_type = (migration['old_instance_type_id'] == - migration['new_instance_type_id']) - sys_meta = utils.metadata_to_dict(instance['system_metadata']) - if restore_old and not same_type: + if restore_old: instance_type = instance_types.extract_instance_type(instance, 'old_') sys_meta = instance_types.save_instance_type_info(sys_meta, @@ -2001,10 +1998,7 @@ class ComputeManager(manager.SchedulerDependentManager): else: instance_type = instance_types.extract_instance_type(instance) - if not same_type: - instance_types.delete_instance_type_info(sys_meta, 'old_') - - # NOTE(danms): new instance type is always stored in prep_resize + instance_types.delete_instance_type_info(sys_meta, 'old_') instance_types.delete_instance_type_info(sys_meta, 'new_') return sys_meta, instance_type @@ -2380,14 +2374,14 @@ class ComputeManager(manager.SchedulerDependentManager): resize_instance = False old_instance_type_id = migration['old_instance_type_id'] new_instance_type_id = migration['new_instance_type_id'] + old_instance_type = instance_types.extract_instance_type(instance) + sys_meta = utils.metadata_to_dict(instance['system_metadata']) + instance_types.save_instance_type_info(sys_meta, + old_instance_type, + prefix='old_') if old_instance_type_id != new_instance_type_id: instance_type = instance_types.extract_instance_type(instance, prefix='new_') - old_instance_type = instance_types.extract_instance_type(instance) - sys_meta = utils.metadata_to_dict(instance['system_metadata']) - instance_types.save_instance_type_info(sys_meta, - old_instance_type, - prefix='old_') instance_types.save_instance_type_info(sys_meta, instance_type) instance = self._instance_update( @@ -2398,7 +2392,7 @@ class ComputeManager(manager.SchedulerDependentManager): vcpus=instance_type['vcpus'], root_gb=instance_type['root_gb'], ephemeral_gb=instance_type['ephemeral_gb'], - system_metadata=sys_meta) + system_metadata=dict(sys_meta)) resize_instance = True @@ -2414,7 +2408,8 @@ class ComputeManager(manager.SchedulerDependentManager): instance = self._instance_update(context, instance['uuid'], task_state=task_states.RESIZE_FINISH, - expected_task_state=task_states.RESIZE_MIGRATED) + expected_task_state=task_states.RESIZE_MIGRATED, + system_metadata=sys_meta) self._notify_about_instance_usage( context, instance, "finish_resize.start", diff --git a/nova/tests/compute/test_compute.py b/nova/tests/compute/test_compute.py index c36496f79..3a1526522 100644 --- a/nova/tests/compute/test_compute.py +++ b/nova/tests/compute/test_compute.py @@ -2806,7 +2806,7 @@ class ComputeTestCase(BaseTestCase): self.mox.StubOutWithMock(instance_types, 'extract_instance_type') self.mox.StubOutWithMock(instance_types, 'delete_instance_type_info') self.mox.StubOutWithMock(instance_types, 'save_instance_type_info') - if revert and old != new: + if revert: instance_types.extract_instance_type(instance, 'old_').AndReturn( {'instance_type_id': old}) instance_types.save_instance_type_info( @@ -2814,9 +2814,8 @@ class ComputeTestCase(BaseTestCase): else: instance_types.extract_instance_type(instance).AndReturn( {'instance_type_id': new}) - if old != new: - instance_types.delete_instance_type_info( - sys_meta, 'old_').AndReturn(sys_meta) + instance_types.delete_instance_type_info( + sys_meta, 'old_').AndReturn(sys_meta) instance_types.delete_instance_type_info( sys_meta, 'new_').AndReturn(sys_meta) -- cgit