diff --git a/nova/compute/resource_tracker.py b/nova/compute/resource_tracker.py index ab3e497f5ade..e866d19ea087 100644 --- a/nova/compute/resource_tracker.py +++ b/nova/compute/resource_tracker.py @@ -1039,38 +1039,9 @@ class ResourceTracker(object): instance, sign=sign) if require_allocation_refresh: - LOG.debug("Auto-correcting allocations to handle Ocata " - "assumptions.") + LOG.debug("Auto-correcting allocations.") self.reportclient.update_instance_allocation(cn, instance, sign) - else: - # NOTE(jaypipes): We're on a Pike compute host or later in - # a deployment with all compute hosts upgraded to Pike or - # later - # - # If that is the case, then we know that the scheduler will - # have properly created an allocation and that the compute - # hosts have not attempted to overwrite allocations - # **during the periodic update_available_resource() call**. - # However, Pike compute hosts may still rework an - # allocation for an instance in a move operation during - # confirm_resize() on the source host which will remove the - # source resource provider from any allocation for an - # instance. - # - # In Queens and beyond, the scheduler will understand when - # a move operation has been requested and instead of - # creating a doubled-up allocation that contains both the - # source and destination host, the scheduler will take the - # original allocation (against the source host) and change - # the consumer ID of that allocation to be the migration - # UUID and not the instance UUID. The scheduler will - # allocate the resources for the destination host to the - # instance UUID. - LOG.debug("We're on a Pike compute host in a deployment " - "with all Pike compute hosts. Skipping " - "auto-correction of allocations.") - # new instance, update compute node resource usage: self._update_usage(self._get_usage_dict(instance), nodename, sign=sign) @@ -1130,6 +1101,22 @@ class ResourceTracker(object): # or a Queens compute host, we do NOT want the Pike compute host to # be "healing" allocation information. Instead, we rely on the Pike # scheduler to properly create allocations during scheduling. + # + # Pike compute hosts may still rework an + # allocation for an instance in a move operation during + # confirm_resize() on the source host which will remove the + # source resource provider from any allocation for an + # instance. + # + # In Queens and beyond, the scheduler will understand when + # a move operation has been requested and instead of + # creating a doubled-up allocation that contains both the + # source and destination host, the scheduler will take the + # original allocation (against the source host) and change + # the consumer ID of that allocation to be the migration + # UUID and not the instance UUID. The scheduler will + # allocate the resources for the destination host to the + # instance UUID. compute_version = objects.Service.get_minimum_version( context, 'nova-compute') has_ocata_computes = compute_version < 22 @@ -1140,8 +1127,29 @@ class ResourceTracker(object): has_ocata_computes or self.driver.requires_allocation_refresh) + msg_allocation_refresh = ( + "Compute driver doesn't require allocation refresh and we're on a " + "compute host in a deployment that only has compute hosts with " + "Nova versions >=16 (Pike). Skipping auto-correction of " + "allocations. ") + if require_allocation_refresh: + if self.driver.requires_allocation_refresh: + msg_allocation_refresh = ( + "Compute driver requires allocation refresh. ") + elif has_ocata_computes: + msg_allocation_refresh = ( + "We're on a compute host from Nova version >=16 (Pike or " + "later) in a deployment with at least one compute host " + "version <16 (Ocata or earlier). ") + msg_allocation_refresh += ( + "Will auto-correct allocations to handle " + "Ocata-style assumptions.") + for instance in instances: if instance.vm_state not in vm_states.ALLOW_RESOURCE_REMOVAL: + if msg_allocation_refresh: + LOG.debug(msg_allocation_refresh) + msg_allocation_refresh = False self._update_usage_from_instance(context, instance, nodename, require_allocation_refresh=require_allocation_refresh)