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 commitc15e36e584
) (cherry picked from commite2b4e3346e
)
This commit is contained in:
parent
259f1bcb79
commit
603171bd5c
|
@ -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
|
||||
|
|
|
@ -2828,7 +2828,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.'
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue