From 33c21d743d9b20006c44c3152e1c5ce4ce7605fc Mon Sep 17 00:00:00 2001 From: Russell Bryant Date: Wed, 24 Oct 2012 15:58:05 -0400 Subject: Send full migration data to finish_resize. This patch updates the finish_resize method in the compute rpc api to receive all of the migration data instead of just the migration id. This avoids an unnecessary database read in finish_resize. Part of blueprint no-db-compute. Change-Id: I4791551a13a8b73e7a5c22ab9f49cdab7db8de1f --- nova/compute/manager.py | 36 ++++++++++++++++++------------------ nova/compute/rpcapi.py | 9 ++++++--- nova/tests/compute/test_compute.py | 13 +++++++------ nova/tests/compute/test_rpcapi.py | 4 ++-- 4 files changed, 33 insertions(+), 29 deletions(-) diff --git a/nova/compute/manager.py b/nova/compute/manager.py index e3a6a2986..be21e6dd1 100644 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -216,7 +216,7 @@ def _get_image_meta(context, image_ref): class ComputeManager(manager.SchedulerDependentManager): """Manages the running instances from creation to destruction.""" - RPC_API_VERSION = '2.7' + RPC_API_VERSION = '2.8' def __init__(self, compute_driver=None, *args, **kwargs): """Load configuration options and connect to the hypervisor.""" @@ -1678,9 +1678,9 @@ class ComputeManager(manager.SchedulerDependentManager): self.network_api.migrate_instance_start(context, instance, self.host) - self.db.migration_update(context, - migration['id'], - {'status': 'post-migrating'}) + migration = self.db.migration_update(context, + migration['id'], + {'status': 'post-migrating'}) self._instance_update(context, instance['uuid'], host=migration['dest_compute'], @@ -1689,17 +1689,17 @@ class ComputeManager(manager.SchedulerDependentManager): RESIZE_MIGRATING) self.compute_rpcapi.finish_resize(context, instance, - migration['id'], image, disk_info, + migration, image, disk_info, migration['dest_compute'], reservations) self._notify_about_instance_usage(context, instance, "resize.end", network_info=network_info) - def _finish_resize(self, context, instance, migration_ref, disk_info, + def _finish_resize(self, context, instance, migration, disk_info, image): resize_instance = False - old_instance_type_id = migration_ref['old_instance_type_id'] - new_instance_type_id = migration_ref['new_instance_type_id'] + old_instance_type_id = migration['old_instance_type_id'] + new_instance_type_id = migration['new_instance_type_id'] if old_instance_type_id != new_instance_type_id: instance_type = instance_types.get_instance_type( new_instance_type_id) @@ -1715,12 +1715,11 @@ class ComputeManager(manager.SchedulerDependentManager): # NOTE(tr3buchet): setup networks on destination host self.network_api.setup_networks_on_host(context, instance, - migration_ref['dest_compute']) + migration['dest_compute']) - if migration_ref['dest_compute'] != \ - migration_ref['source_compute']: + if migration['dest_compute'] != migration['source_compute']: self.network_api.migrate_instance_finish(context, instance, - migration_ref['dest_compute']) + migration['dest_compute']) network_info = self._get_instance_nw_info(context, instance) @@ -1743,7 +1742,7 @@ class ComputeManager(manager.SchedulerDependentManager): self.volume_api.initialize_connection(context, volume, connector) - self.driver.finish_migration(context, migration_ref, instance, + self.driver.finish_migration(context, migration, instance, disk_info, self._legacy_nw_info(network_info), image, resize_instance, @@ -1757,7 +1756,7 @@ class ComputeManager(manager.SchedulerDependentManager): expected_task_state=task_states. RESIZE_FINISH) - self.db.migration_update(context, migration_ref.id, + self.db.migration_update(context, migration['id'], {'status': 'finished'}) self._notify_about_instance_usage( @@ -1767,17 +1766,18 @@ class ComputeManager(manager.SchedulerDependentManager): @exception.wrap_exception(notifier=notifier, publisher_id=publisher_id()) @reverts_task_state @wrap_instance_fault - def finish_resize(self, context, migration_id, disk_info, image, - instance, reservations=None): + def finish_resize(self, context, disk_info, image, instance, + reservations=None, migration=None, migration_id=None): """Completes the migration process. Sets up the newly transferred disk and turns on the instance at its new host machine. """ - migration_ref = self.db.migration_get(context, migration_id) + if not migration: + migration = self.db.migration_get(context, migration_id) try: - self._finish_resize(context, instance, migration_ref, + self._finish_resize(context, instance, migration, disk_info, image) self._quota_commit(context, reservations) except Exception, error: diff --git a/nova/compute/rpcapi.py b/nova/compute/rpcapi.py index e0988d92b..cb1ddede8 100644 --- a/nova/compute/rpcapi.py +++ b/nova/compute/rpcapi.py @@ -135,6 +135,7 @@ class ComputeAPI(nova.openstack.common.rpc.proxy.RpcProxy): 2.5 - Add block device and network info to reboot_instance 2.6 - Remove migration_id, add migration to resize_instance 2.7 - Remove migration_id, add migration to confirm_resize + 2.8 - Remove migration_id, add migration to finish_resize ''' # @@ -223,13 +224,15 @@ class ComputeAPI(nova.openstack.common.rpc.proxy.RpcProxy): instance=instance_p, volume_id=volume_id), topic=_compute_topic(self.topic, ctxt, None, instance)) - def finish_resize(self, ctxt, instance, migration_id, image, disk_info, + def finish_resize(self, ctxt, instance, migration, image, disk_info, host, reservations=None): instance_p = jsonutils.to_primitive(instance) + migration_p = jsonutils.to_primitive(migration) self.cast(ctxt, self.make_msg('finish_resize', - instance=instance_p, migration_id=migration_id, + instance=instance_p, migration=migration_p, image=image, disk_info=disk_info, reservations=reservations), - topic=_compute_topic(self.topic, ctxt, host, None)) + topic=_compute_topic(self.topic, ctxt, host, None), + version='2.8') def finish_revert_resize(self, ctxt, instance, migration_id, host, reservations=None): diff --git a/nova/tests/compute/test_compute.py b/nova/tests/compute/test_compute.py index d61d1182b..d989c488e 100644 --- a/nova/tests/compute/test_compute.py +++ b/nova/tests/compute/test_compute.py @@ -1616,7 +1616,7 @@ class ComputeTestCase(BaseTestCase): db.instance_update(self.context, instance["uuid"], {"task_state": task_states.RESIZE_MIGRATED}) self.compute.finish_resize(context, - migration_id=int(migration_ref['id']), + migration=jsonutils.to_primitive(migration_ref), disk_info={}, image={}, instance=instance, reservations=reservations) self.compute.terminate_instance(self.context, instance=instance) @@ -1646,7 +1646,8 @@ class ComputeTestCase(BaseTestCase): db.instance_update(self.context, instance["uuid"], {"task_state": task_states.RESIZE_MIGRATED}) self.assertRaises(test.TestingException, self.compute.finish_resize, - context, migration_id=int(migration_ref['id']), + context, + migration=jsonutils.to_primitive(migration_ref), disk_info={}, image={}, instance=instance, reservations=reservations) @@ -1750,8 +1751,8 @@ class ComputeTestCase(BaseTestCase): test_notifier.NOTIFICATIONS = [] self.compute.finish_resize(context, - migration_id=int(migration_ref['id']), disk_info={}, image={}, - instance=instance) + migration=jsonutils.to_primitive(migration_ref), + disk_info={}, image={}, instance=instance) self.assertEquals(len(test_notifier.NOTIFICATIONS), 2) msg = test_notifier.NOTIFICATIONS[0] @@ -1943,8 +1944,8 @@ class ComputeTestCase(BaseTestCase): migration=migration_ref, image={}) self.compute.finish_resize(context, - migration_id=int(migration_ref['id']), disk_info={}, - image={}, instance=instance) + migration=jsonutils.to_primitive(migration_ref), + disk_info={}, image={}, instance=instance) # Prove that the instance size is now the new size inst_ref = db.instance_get_by_uuid(context, instance['uuid']) diff --git a/nova/tests/compute/test_rpcapi.py b/nova/tests/compute/test_rpcapi.py index ee863cc8a..460fbc24a 100644 --- a/nova/tests/compute/test_rpcapi.py +++ b/nova/tests/compute/test_rpcapi.py @@ -137,9 +137,9 @@ class ComputeRpcAPITestCase(test.TestCase): def test_finish_resize(self): self._test_compute_api('finish_resize', 'cast', - instance=self.fake_instance, migration_id='id', + instance=self.fake_instance, migration={'id': 'foo'}, image='image', disk_info='disk_info', host='host', - reservations=list('fake_res')) + reservations=list('fake_res'), version='2.8') def test_finish_revert_resize(self): self._test_compute_api('finish_revert_resize', 'cast', -- cgit