Merge "[rt] Apply migration context for incoming migrations"
This commit is contained in:
commit
14bfbaa50e
@ -932,14 +932,41 @@ class ResourceTracker(object):
|
||||
'flavor', 'migration_context',
|
||||
'resources'])
|
||||
|
||||
# Now calculate usage based on instance utilization:
|
||||
instance_by_uuid = self._update_usage_from_instances(
|
||||
context, instances, nodename)
|
||||
|
||||
# Grab all in-progress migrations and error migrations:
|
||||
migrations = objects.MigrationList.get_in_progress_and_error(
|
||||
context, self.host, nodename)
|
||||
|
||||
# Check for tracked instances with in-progress, incoming, but not
|
||||
# finished migrations. For those instance the migration context
|
||||
# is not applied yet (it will be during finish_resize when the
|
||||
# migration goes to finished state). We need to manually and
|
||||
# temporary apply the migration context here when the resource usage is
|
||||
# updated. See bug 1953359 for more details.
|
||||
instance_by_uuid = {instance.uuid: instance for instance in instances}
|
||||
for migration in migrations:
|
||||
if (
|
||||
migration.instance_uuid in instance_by_uuid and
|
||||
migration.dest_compute == self.host and
|
||||
migration.dest_node == nodename
|
||||
):
|
||||
# we does not check for the 'post-migrating' migration status
|
||||
# as applying the migration context for an instance already
|
||||
# in finished migration status is a no-op anyhow.
|
||||
instance = instance_by_uuid[migration.instance_uuid]
|
||||
LOG.debug(
|
||||
'Applying migration context for instance %s as it has an '
|
||||
'incoming, in-progress migration %s. '
|
||||
'Migration status is %s',
|
||||
migration.instance_uuid, migration.uuid, migration.status
|
||||
)
|
||||
# It is OK not to revert the migration context at the end of
|
||||
# the periodic as the instance is not saved during the periodic
|
||||
instance.apply_migration_context()
|
||||
|
||||
# Now calculate usage based on instance utilization:
|
||||
instance_by_uuid = self._update_usage_from_instances(
|
||||
context, instances, nodename)
|
||||
|
||||
self._pair_instances_to_migrations(migrations, instance_by_uuid)
|
||||
self._update_usage_from_migrations(context, migrations, nodename)
|
||||
|
||||
|
@ -990,11 +990,11 @@ class NUMAServersTest(NUMAServersTestBase):
|
||||
'vCPUs mapping: [(0, 1)]',
|
||||
log,
|
||||
)
|
||||
# But the periodic fails as it tries to apply the source topology
|
||||
# on the dest. This is bug 1953359.
|
||||
# We expect that the periodic not fails as bug 1953359 is fixed.
|
||||
log = self.stdlog.logger.output
|
||||
self.assertIn('Error updating resources for node compute2', log)
|
||||
self.assertIn(
|
||||
self.assertIn('Running periodic for compute (compute2)', log)
|
||||
self.assertNotIn('Error updating resources for node compute2', log)
|
||||
self.assertNotIn(
|
||||
'nova.exception.CPUPinningInvalid: CPU set to pin [0] must be '
|
||||
'a subset of free CPU set [1]',
|
||||
log,
|
||||
@ -1012,27 +1012,16 @@ class NUMAServersTest(NUMAServersTestBase):
|
||||
new=fake_finish_resize,
|
||||
):
|
||||
post = {'migrate': None}
|
||||
# this is expected to succeed but logs are emitted
|
||||
# from the racing periodic task. See fake_finish_resize
|
||||
# for the asserts
|
||||
# this is expected to succeed
|
||||
self.admin_api.post_server_action(server['id'], post)
|
||||
|
||||
server = self._wait_for_state_change(server, 'VERIFY_RESIZE')
|
||||
|
||||
# as the periodic job raced and failed during the resize if we revert
|
||||
# the instance now then it tries to unpin its cpus from the dest host
|
||||
# but those was never pinned as the periodic failed. So the unpinning
|
||||
# will fail too.
|
||||
# As bug 1953359 is fixed the revert should succeed too
|
||||
post = {'revertResize': {}}
|
||||
ex = self.assertRaises(
|
||||
client.OpenStackApiException,
|
||||
self.admin_api.post_server_action, server['id'], post
|
||||
)
|
||||
# This is still bug 1953359.
|
||||
self.assertEqual(500, ex.response.status_code)
|
||||
server = self.api.get_server(server['id'])
|
||||
self.assertEqual('ERROR', server['status'])
|
||||
self.assertIn(
|
||||
self.admin_api.post_server_action(server['id'], post)
|
||||
self._wait_for_state_change(server, 'ACTIVE')
|
||||
self.assertNotIn(
|
||||
'nova.exception.CPUUnpinningInvalid: CPU set to unpin [1] must be '
|
||||
'a subset of pinned CPU set [0]',
|
||||
self.stdlog.logger.output,
|
||||
|
Loading…
Reference in New Issue
Block a user