Skip to content

Commit 6339e8c

Browse files
Zuulopenstack-gerrit
authored andcommitted
Merge "Update usage in RT.drop_move_claim during confirm resize"
2 parents 4c13a93 + ad9f373 commit 6339e8c

File tree

5 files changed

+43
-26
lines changed

5 files changed

+43
-26
lines changed

nova/compute/manager.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4073,6 +4073,10 @@ def _confirm_resize(self, context, instance, migration=None):
40734073
migration.status = 'confirmed'
40744074
migration.save()
40754075

4076+
# NOTE(mriedem): drop_move_claim relies on
4077+
# instance.migration_context so make sure to not call
4078+
# instance.drop_migration_context() until after drop_move_claim
4079+
# is called.
40764080
self.rt.drop_move_claim(context, instance, migration.source_node,
40774081
old_instance_type, prefix='old_')
40784082
instance.drop_migration_context()

nova/compute/resource_tracker.py

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -459,31 +459,27 @@ def drop_move_claim(self, context, instance, nodename,
459459
attributes. 'old_' or 'new_', with 'new_' being the
460460
default.
461461
"""
462+
# Remove usage for an instance that is tracked in migrations, such as
463+
# on the dest node during revert resize.
462464
if instance['uuid'] in self.tracked_migrations:
463465
migration = self.tracked_migrations.pop(instance['uuid'])
464-
465466
if not instance_type:
466467
instance_type = self._get_instance_type(instance, prefix,
467468
migration)
468-
469-
if instance_type is not None:
470-
numa_topology = self._get_migration_context_resource(
471-
'numa_topology', instance, prefix=prefix)
472-
usage = self._get_usage_dict(
473-
instance_type, instance, numa_topology=numa_topology)
474-
self._drop_pci_devices(instance, nodename, prefix)
475-
self._update_usage(usage, nodename, sign=-1)
476-
477-
ctxt = context.elevated()
478-
self._update(ctxt, self.compute_nodes[nodename])
479469
# Remove usage for an instance that is not tracked in migrations (such
480470
# as on the source node after a migration).
481471
# NOTE(lbeliveau): On resize on the same node, the instance is
482472
# included in both tracked_migrations and tracked_instances.
483-
elif (instance['uuid'] in self.tracked_instances):
473+
elif instance['uuid'] in self.tracked_instances:
484474
self.tracked_instances.remove(instance['uuid'])
475+
476+
if instance_type is not None:
477+
numa_topology = self._get_migration_context_resource(
478+
'numa_topology', instance, prefix=prefix)
479+
usage = self._get_usage_dict(
480+
instance_type, instance, numa_topology=numa_topology)
485481
self._drop_pci_devices(instance, nodename, prefix)
486-
# TODO(lbeliveau): Validate if numa needs the same treatment.
482+
self._update_usage(usage, nodename, sign=-1)
487483

488484
ctxt = context.elevated()
489485
self._update(ctxt, self.compute_nodes[nodename])

nova/tests/functional/test_servers.py

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2121,13 +2121,8 @@ def test_resize_confirm_assert_hypervisor_usage_no_periodics(self):
21212121
self._wait_for_state_change(self.api, server, 'ACTIVE')
21222122

21232123
# There should no resource usage for flavor1 on the source host.
2124-
# FIXME(mriedem): This is bug 1818914 where the source host continues
2125-
# to report old_flavor usage until the update_available_resource
2126-
# periodic task runs. Uncomment this once fixed.
2127-
# self.assert_hypervisor_usage(
2128-
# source_rp_uuid, no_usage, volume_backed=False)
21292124
self.assert_hypervisor_usage(
2130-
source_rp_uuid, self.flavor1, volume_backed=False)
2125+
source_rp_uuid, no_usage, volume_backed=False)
21312126
# And resource usage for flavor2 should still be on the target host.
21322127
self.assert_hypervisor_usage(
21332128
dest_rp_uuid, self.flavor2, volume_backed=False)

nova/tests/unit/compute/test_compute_mgr.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7261,7 +7261,15 @@ def test_confirm_resize_deletes_allocations(self):
72617261
def do_confirm_resize(mock_save, mock_drop, mock_delete,
72627262
mock_confirm, mock_nwapi, mock_notify,
72637263
mock_mig_save, mock_mig_get, mock_inst_get):
7264-
self._mock_rt()
7264+
7265+
def fake_drop_move_claim(*args, **kwargs):
7266+
# RT.drop_move_claim must be called before
7267+
# instance.drop_migration_context.
7268+
mock_drop.assert_not_called()
7269+
7270+
mock_rt = self._mock_rt()
7271+
# Enforce order of drop_move_claim/drop_migration_context calls.
7272+
mock_rt.drop_move_claim.side_effect = fake_drop_move_claim
72657273
self.instance.migration_context = objects.MigrationContext(
72667274
new_pci_devices=None,
72677275
old_pci_devices=None)

nova/tests/unit/compute/test_resource_tracker.py

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2490,23 +2490,37 @@ def test_drop_move_claim_on_revert(self):
24902490

24912491
instance = _INSTANCE_FIXTURES[0].obj_clone()
24922492
instance.task_state = task_states.RESIZE_MIGRATING
2493-
instance.flavor = _INSTANCE_TYPE_OBJ_FIXTURES[2]
2493+
instance.new_flavor = _INSTANCE_TYPE_OBJ_FIXTURES[2]
24942494
instance.migration_context = objects.MigrationContext()
24952495
instance.migration_context.new_pci_devices = objects.PciDeviceList(
24962496
objects=pci_devs)
24972497

2498-
self.rt.tracked_instances = set([instance.uuid])
2498+
# When reverting a resize and dropping the move claim, the
2499+
# destination compute calls drop_move_claim to drop the new_flavor
2500+
# usage and the instance should be in tracked_migrations from when
2501+
# the resize_claim was made on the dest during prep_resize.
2502+
self.rt.tracked_migrations = {
2503+
instance.uuid: objects.Migration(migration_type='resize')}
24992504

25002505
# not using mock.sentinel.ctx because drop_move_claim calls elevated
25012506
ctx = mock.MagicMock()
25022507

25032508
with test.nested(
2504-
mock.patch.object(self.rt, '_update'),
2505-
mock.patch.object(self.rt.pci_tracker, 'free_device')
2506-
) as (update_mock, mock_pci_free_device):
2509+
mock.patch.object(self.rt, '_update'),
2510+
mock.patch.object(self.rt.pci_tracker, 'free_device'),
2511+
mock.patch.object(self.rt, '_get_usage_dict'),
2512+
mock.patch.object(self.rt, '_update_usage')
2513+
) as (
2514+
update_mock, mock_pci_free_device, mock_get_usage,
2515+
mock_update_usage,
2516+
):
25072517
self.rt.drop_move_claim(ctx, instance, _NODENAME)
25082518
mock_pci_free_device.assert_called_once_with(
25092519
pci_dev, mock.ANY)
2520+
mock_get_usage.assert_called_once_with(
2521+
instance.new_flavor, instance, numa_topology=None)
2522+
mock_update_usage.assert_called_once_with(
2523+
mock_get_usage.return_value, _NODENAME, sign=-1)
25102524

25112525
@mock.patch('nova.compute.utils.is_volume_backed_instance',
25122526
return_value=False)

0 commit comments

Comments
 (0)