summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZuul <zuul@review.opendev.org>2022-06-15 04:28:21 +0000
committerGerrit Code Review <review@openstack.org>2022-06-15 04:28:21 +0000
commit4eaceeec4d0c7a37cfed1194d02a403c057d0af3 (patch)
tree1d4aa68431cfeb0c2c1c59b70ecddde18ad44593
parent490b93812958a8f3bb82c7e8d5181f53ba7c84b0 (diff)
parent1d0b7051da430ed00ae49901a32ec6af46c1a64e (diff)
downloadnova-4eaceeec4d0c7a37cfed1194d02a403c057d0af3.tar.gz
Merge "[rt] Apply migration context for incoming migrations" into stable/ussuri
-rw-r--r--nova/compute/resource_tracker.py35
-rw-r--r--nova/tests/functional/libvirt/test_numa_servers.py29
2 files changed, 40 insertions, 24 deletions
diff --git a/nova/compute/resource_tracker.py b/nova/compute/resource_tracker.py
index a7658f218e..c12ada21e7 100644
--- a/nova/compute/resource_tracker.py
+++ b/nova/compute/resource_tracker.py
@@ -919,14 +919,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:
migrations = objects.MigrationList.get_in_progress_by_host_and_node(
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)
diff --git a/nova/tests/functional/libvirt/test_numa_servers.py b/nova/tests/functional/libvirt/test_numa_servers.py
index 773e6f56d3..5423e89aff 100644
--- a/nova/tests/functional/libvirt/test_numa_servers.py
+++ b/nova/tests/functional/libvirt/test_numa_servers.py
@@ -825,11 +825,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,
@@ -847,27 +847,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,