diff options
author | Zuul <zuul@review.opendev.org> | 2022-06-15 04:28:21 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2022-06-15 04:28:21 +0000 |
commit | 4eaceeec4d0c7a37cfed1194d02a403c057d0af3 (patch) | |
tree | 1d4aa68431cfeb0c2c1c59b70ecddde18ad44593 | |
parent | 490b93812958a8f3bb82c7e8d5181f53ba7c84b0 (diff) | |
parent | 1d0b7051da430ed00ae49901a32ec6af46c1a64e (diff) | |
download | nova-4eaceeec4d0c7a37cfed1194d02a403c057d0af3.tar.gz |
Merge "[rt] Apply migration context for incoming migrations" into stable/ussuri
-rw-r--r-- | nova/compute/resource_tracker.py | 35 | ||||
-rw-r--r-- | nova/tests/functional/libvirt/test_numa_servers.py | 29 |
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, |