Merge "Do not untrack resources of a server being unshelved" into unmaintained/yoga
This commit is contained in:
commit
ba47def308
@ -6646,9 +6646,9 @@ class ComputeManager(manager.Manager):
|
||||
|
||||
instance.power_state = current_power_state
|
||||
# NOTE(mriedem): The vm_state has to be set before updating the
|
||||
# resource tracker, see vm_states.ALLOW_RESOURCE_REMOVAL. The host/node
|
||||
# values cannot be nulled out until after updating the resource tracker
|
||||
# though.
|
||||
# resource tracker, see vm_states.allow_resource_removal(). The
|
||||
# host/node values cannot be nulled out until after updating the
|
||||
# resource tracker though.
|
||||
instance.vm_state = vm_states.SHELVED_OFFLOADED
|
||||
instance.task_state = None
|
||||
instance.save(expected_task_state=[task_states.SHELVING,
|
||||
|
@ -1495,7 +1495,8 @@ class ResourceTracker(object):
|
||||
# NOTE(sfinucan): Both brand new instances as well as instances that
|
||||
# are being unshelved will have is_new_instance == True
|
||||
is_removed_instance = not is_new_instance and (is_removed or
|
||||
instance['vm_state'] in vm_states.ALLOW_RESOURCE_REMOVAL)
|
||||
vm_states.allow_resource_removal(
|
||||
vm_state=instance['vm_state'], task_state=instance.task_state))
|
||||
|
||||
if is_new_instance:
|
||||
self.tracked_instances.add(uuid)
|
||||
@ -1554,7 +1555,9 @@ class ResourceTracker(object):
|
||||
|
||||
instance_by_uuid = {}
|
||||
for instance in instances:
|
||||
if instance.vm_state not in vm_states.ALLOW_RESOURCE_REMOVAL:
|
||||
if not vm_states.allow_resource_removal(
|
||||
vm_state=instance['vm_state'],
|
||||
task_state=instance.task_state):
|
||||
self._update_usage_from_instance(context, instance, nodename)
|
||||
instance_by_uuid[instance.uuid] = instance
|
||||
return instance_by_uuid
|
||||
|
@ -105,7 +105,8 @@ class Stats(dict):
|
||||
(vm_state, task_state, os_type, project_id) = \
|
||||
self._extract_state_from_instance(instance)
|
||||
|
||||
if is_removed or vm_state in vm_states.ALLOW_RESOURCE_REMOVAL:
|
||||
if is_removed or vm_states.allow_resource_removal(
|
||||
vm_state=vm_state, task_state=task_state):
|
||||
self._decrement("num_instances")
|
||||
self.states.pop(uuid)
|
||||
else:
|
||||
|
@ -27,6 +27,7 @@ health and progress.
|
||||
See http://wiki.openstack.org/VMState
|
||||
"""
|
||||
|
||||
from nova.compute import task_states
|
||||
from nova.objects import fields
|
||||
|
||||
|
||||
@ -74,5 +75,11 @@ ALLOW_HARD_REBOOT = ALLOW_SOFT_REBOOT + [STOPPED, PAUSED, SUSPENDED, ERROR]
|
||||
# states we allow to trigger crash dump
|
||||
ALLOW_TRIGGER_CRASH_DUMP = [ACTIVE, PAUSED, RESCUED, RESIZED, ERROR]
|
||||
|
||||
# states we allow resources to be freed in
|
||||
ALLOW_RESOURCE_REMOVAL = [DELETED, SHELVED_OFFLOADED]
|
||||
|
||||
def allow_resource_removal(vm_state, task_state=None):
|
||||
"""(vm_state, task_state) combinations we allow resources to be freed in"""
|
||||
|
||||
return (
|
||||
vm_state == DELETED or
|
||||
vm_state == SHELVED_OFFLOADED and task_state != task_states.SPAWNING
|
||||
)
|
||||
|
@ -82,6 +82,5 @@ class UnshelveUpdateAvailableResourcesPeriodicRace(
|
||||
|
||||
node = compute_node.ComputeNode.get_by_nodename(
|
||||
context.get_admin_context(), 'compute1')
|
||||
# This is the bug, the instance should have resources claimed
|
||||
# self.assertEqual(1, node.vcpus_used)
|
||||
self.assertEqual(0, node.vcpus_used)
|
||||
# After the fix, the instance should have resources claimed
|
||||
self.assertEqual(1, node.vcpus_used)
|
||||
|
@ -208,6 +208,22 @@ class StatsTestCase(test.NoDBTestCase):
|
||||
self.assertEqual(0, self.stats.num_os_type("Linux"))
|
||||
self.assertEqual(0, self.stats["num_vm_" + vm_states.BUILDING])
|
||||
|
||||
def test_update_stats_for_instance_being_unshelved(self):
|
||||
instance = self._create_instance()
|
||||
self.stats.update_stats_for_instance(instance)
|
||||
self.assertEqual(1, self.stats.num_instances_for_project("1234"))
|
||||
|
||||
instance["vm_state"] = vm_states.SHELVED_OFFLOADED
|
||||
instance["task_state"] = task_states.SPAWNING
|
||||
self.stats.update_stats_for_instance(instance)
|
||||
|
||||
self.assertEqual(1, self.stats.num_instances)
|
||||
self.assertEqual(1, self.stats.num_instances_for_project(1234))
|
||||
self.assertEqual(1, self.stats["num_os_type_Linux"])
|
||||
self.assertEqual(1, self.stats["num_vm_%s" %
|
||||
vm_states.SHELVED_OFFLOADED])
|
||||
self.assertEqual(1, self.stats["num_task_%s" % task_states.SPAWNING])
|
||||
|
||||
def test_io_workload(self):
|
||||
vms = [vm_states.ACTIVE, vm_states.BUILDING, vm_states.PAUSED]
|
||||
tasks = [task_states.RESIZE_MIGRATING, task_states.REBUILDING,
|
||||
|
Loading…
Reference in New Issue
Block a user