Join migration_context and flavor in Migration.instance

This builds on Ifc7dcde8a659710acecb1967da15c632c69d675c
by joining the Migration.instance migration_context and
flavor to avoid lazy-loading those later.

When tracking an incoming migration, the ResourceTracker
_pair_instances_to_migrations can hit a KeyError since it's
not yet tracking the instance on that dest host yet. Then
_update_usage_from_migrations will lazy-load the Migration.instance
field and access the migration_context and flavor fields on the
instance, which get lazy-loaded, which kind of defeats part of
the purpose of that optimization.

Change-Id: I613ad054f77b1a0a9d2e7718c0c531d11525283c
Related-Bug: #1540526
(cherry picked from commit c15e36e584)
(cherry picked from commit e2b4e3346e)
(cherry picked from commit 603171bd5c)
This commit is contained in:
Matt Riedemann 2019-10-21 13:00:59 -04:00
parent 8800b90bdf
commit e48fb84e12
3 changed files with 11 additions and 6 deletions

View File

@ -169,7 +169,8 @@ class Migration(base.NovaPersistentObject, base.NovaObject,
def instance(self):
if not hasattr(self, '_cached_instance'):
self._cached_instance = objects.Instance.get_by_uuid(
self._context, self.instance_uuid)
self._context, self.instance_uuid,
expected_attrs=['migration_context', 'flavor'])
return self._cached_instance
@instance.setter

View File

@ -2660,7 +2660,10 @@ class TestUpdateUsageFromMigrations(BaseTestCase):
self.rt._update_usage_from_migrations(mock.sentinel.ctx, [migration],
_NODENAME)
mock_get_instance.assert_called_once_with(mock.sentinel.ctx,
'some_uuid')
'some_uuid',
expected_attrs=[
'migration_context',
'flavor'])
self.assertFalse(mock_update_usage.called)
@mock.patch('nova.compute.resource_tracker.ResourceTracker.'

View File

@ -161,10 +161,11 @@ class _TestMigrationObject(object):
fake_migration)
mig._context = ctxt
self.assertEqual(mig.instance.host, fake_inst['host'])
mock_get.assert_called_once_with(ctxt,
fake_migration['instance_uuid'],
columns_to_join=['info_cache',
'security_groups'])
mock_get.assert_called_once_with(
ctxt, fake_migration['instance_uuid'],
columns_to_join=['extra',
'extra.flavor',
'extra.migration_context'])
def test_instance_setter(self):
migration = objects.Migration(instance_uuid=uuidsentinel.instance)