Avoid redundant BDM lookup in check_can_live_migrate_source

We are querying the BDMs for the instance twice in the
check_can_live_migrate_source method, once via
is_volume_backed_instance and once via
_get_instance_block_device_info. We can just query the BDMs
once at the top and pass them into those utility methods.

And then we'll all enjoy infinitely faster live migrations!

Change-Id: I2b456120f0027a2a365d67fcbffa7cf4ac15433b
This commit is contained in:
Matt Riedemann 2017-10-04 16:38:08 -04:00
parent 659b63d84b
commit f39355e7c9
2 changed files with 16 additions and 8 deletions

View File

@ -5414,8 +5414,10 @@ class ComputeManager(manager.Manager):
:param dest_check_data: result of check_can_live_migrate_destination
:returns: a dict containing migration info
"""
is_volume_backed = compute_utils.is_volume_backed_instance(ctxt,
instance)
bdms = objects.BlockDeviceMappingList.get_by_instance_uuid(
ctxt, instance.uuid)
is_volume_backed = compute_utils.is_volume_backed_instance(
ctxt, instance, bdms)
# TODO(tdurakov): remove dict to object conversion once RPC API version
# is bumped to 5.x
got_migrate_data_object = isinstance(dest_check_data,
@ -5426,7 +5428,7 @@ class ComputeManager(manager.Manager):
dest_check_data)
dest_check_data.is_volume_backed = is_volume_backed
block_device_info = self._get_instance_block_device_info(
ctxt, instance, refresh_conn_info=False)
ctxt, instance, refresh_conn_info=False, bdms=bdms)
result = self.driver.check_can_live_migrate_source(ctxt, instance,
dest_check_data,
block_device_info)

View File

@ -2271,6 +2271,7 @@ class ComputeManagerUnitTestCase(test.NoDBTestCase):
# Cinder-initiated call, we don't call migrate_volume_completion.
migrate_volume_completion.assert_not_called()
@mock.patch.object(objects.BlockDeviceMappingList, 'get_by_instance_uuid')
@mock.patch.object(fake_driver.FakeDriver,
'check_can_live_migrate_source')
@mock.patch.object(manager.ComputeManager,
@ -2278,7 +2279,10 @@ class ComputeManagerUnitTestCase(test.NoDBTestCase):
@mock.patch.object(compute_utils, 'is_volume_backed_instance')
@mock.patch.object(compute_utils, 'EventReporter')
def test_check_can_live_migrate_source(self, mock_event, mock_volume,
mock_get_inst, mock_check):
mock_get_inst, mock_check,
mock_get_bdms):
fake_bdms = objects.BlockDeviceMappingList()
mock_get_bdms.return_value = fake_bdms
is_volume_backed = 'volume_backed'
dest_check_data = migrate_data_obj.LiveMigrateData()
db_instance = fake_instance.fake_db_instance()
@ -2297,9 +2301,10 @@ class ComputeManagerUnitTestCase(test.NoDBTestCase):
mock_check.assert_called_once_with(self.context, instance,
dest_check_data,
{'block_device_mapping': 'fake'})
mock_volume.assert_called_once_with(self.context, instance)
mock_volume.assert_called_once_with(self.context, instance, fake_bdms)
mock_get_inst.assert_called_once_with(self.context, instance,
refresh_conn_info=False)
refresh_conn_info=False,
bdms=fake_bdms)
self.assertTrue(dest_check_data.is_volume_backed)
@ -5912,7 +5917,8 @@ class ComputeManagerMigrationTestCase(test.NoDBTestCase):
self.assertIsInstance(compute._live_migration_semaphore,
compute_utils.UnlimitedSemaphore)
def test_check_migrate_source_converts_object(self):
@mock.patch.object(objects.BlockDeviceMappingList, 'get_by_instance_uuid')
def test_check_migrate_source_converts_object(self, mock_get_bdms):
# NOTE(danms): Make sure that we legacy-ify any data objects
# the drivers give us back, if we were passed a non-object
data = migrate_data_obj.LiveMigrateData(is_volume_backed=False)
@ -5925,7 +5931,7 @@ class ComputeManagerMigrationTestCase(test.NoDBTestCase):
mock_cclms.return_value = data
self.assertIsInstance(
compute.check_can_live_migrate_source(
self.context, {'uuid': uuids.instance}, {}),
self.context, objects.Instance(uuid=uuids.instance), {}),
dict)
self.assertIsInstance(mock_cclms.call_args_list[0][0][2],
migrate_data_obj.LiveMigrateData)