repoduce post liberty pre vicoria instance numa db issue

This change reproduces a bug in the db load of old
instance numa toplogy json blobs in
_migrate_legacy_dedicated_instance_cpuset
that failed to account for defaulting pcpuset to
the empty set when it is not in the json blob.

Related-Bug: #2080556
Change-Id: Ia0f327c501f65786d5b2538b2742ec2786486956
(cherry picked from commit 521db4a435)
(cherry picked from commit c00b76b25c)
This commit is contained in:
Sean Mooney
2024-09-12 13:47:30 +01:00
committed by Balazs Gibizer
parent 021ea3f9d6
commit 7ae3afeb5b
2 changed files with 50 additions and 0 deletions

View File

@@ -192,6 +192,11 @@ class InstanceNUMATopology(base.NovaObject,
continue
if cell.cpu_policy != obj_fields.CPUAllocationPolicy.DEDICATED:
# FIXME(sean-k-mooney): we should be setting the pcpuset
# to an empty set here
# if not 'pcpuset' in cell:
# cell.pcpuset = set()
# update_db = True
continue
cell.pcpuset = cell.cpuset

View File

@@ -372,6 +372,51 @@ class _TestInstanceNUMATopology(object):
self.assertEqual(set(), obj_cell.cpuset)
self.assertEqual(topo_cell.cpuset, obj_cell.pcpuset)
def test_obj_from_db_obj_no_pinning(self):
"""Test of creating 'InstanceNUMATopology' OVO object from the
database primitives, which has an old version 'InstanceNUMACell'
primitives.
Prior to version 1.5, 'InstanceNUMACell' saves the instance CPUs in
the 'cpuset' field, for both the pinned CPUs of a dedicated and the
un-pinned CPUs of a shared instances, after version 1.5, any pinned
CPUs of dedicated instance are moved to 'pcpuset'. this test verifies
the CPU movement for instance with a 'dedicated' allocation policy.
This test is for the case where the instance has no pinned CPUs but
the instance has a numa topology such as when hugepages are used.
See bug: https://bugs.launchpad.net/nova/+bug/2080556 for more details.
"""
fake_topo_obj_w_cell_v1_4 = objects.InstanceNUMATopology(
instance_uuid=fake_instance_uuid,
cells=[
objects.InstanceNUMACell(
id=0, cpuset=set([1, 2]), memory=512,
pagesize=2048),
objects.InstanceNUMACell(
id=1, cpuset=set([3, 4]), memory=512,
pagesize=2048),
])
fake_topo_obj = copy.deepcopy(fake_topo_obj_w_cell_v1_4)
for cell in fake_topo_obj.cells:
cell.cpu_policy = objects.fields.CPUAllocationPolicy.SHARED
numa_topology = objects.InstanceNUMATopology.obj_from_db_obj(
self.context, fake_instance_uuid, fake_topo_obj._to_json())
for obj_cell, topo_cell in zip(
numa_topology.cells,
fake_topo_obj_w_cell_v1_4['cells']):
self.assertEqual(topo_cell.cpuset, obj_cell.cpuset)
# 'pcpuset' should be an empty set however
# obj_from_db_obj() or more specifically
# _migrate_legacy_dedicated_instance_cpuset() does not set
# 'pcpuset' to an empty set when it is not in the json data.
# self.assertEqual(set(), obj_cell.pcpuset)
self.assertRaises(
NotImplementedError, getattr, obj_cell, 'pcpuset')
class TestInstanceNUMATopology(
test_objects._LocalTest, _TestInstanceNUMATopology,