diff --git a/nova/objects/instance_numa.py b/nova/objects/instance_numa.py index f112b08d535f..3a6d2e34763e 100644 --- a/nova/objects/instance_numa.py +++ b/nova/objects/instance_numa.py @@ -198,14 +198,23 @@ class InstanceNUMATopology(base.NovaObject, for cell in obj.cells: if len(cell.cpuset) == 0: continue - + # NOTE(gibi): This data migration populates the pcpuset field that + # is new in version 1.5. However below we bump the object version + # to 1.6 directly. This is intentional. The version 1.6 introduced + # a new possible value 'mixed' for the cpu_policy field. As that + # is a forward compatible change we don't have a specific data + # migration for it. But we also don't have an automated way to bump + # old object versions from 1.5 to 1.6. So we do it here just to + # avoid inconsistency between data and version in the DB. if cell.cpu_policy == obj_fields.CPUAllocationPolicy.DEDICATED: cell.pcpuset = cell.cpuset cell.cpuset = set() + cell.VERSION = '1.6' update_db = True else: if 'pcpuset' not in cell: cell.pcpuset = set() + cell.VERSION = '1.6' update_db = True return update_db diff --git a/nova/tests/unit/objects/test_instance_numa.py b/nova/tests/unit/objects/test_instance_numa.py index c677fd09ca9d..c99431e56783 100644 --- a/nova/tests/unit/objects/test_instance_numa.py +++ b/nova/tests/unit/objects/test_instance_numa.py @@ -446,11 +446,8 @@ class _TestInstanceNUMATopology(object): # pcpuset self.assertEqual(set(), topo_loaded.cells[0].cpuset) self.assertEqual({0, 1}, topo_loaded.cells[0].pcpuset) - # but the object version isn't bumped. So when the - # data is saved back to the DB it still has the old version 1.4, but - # also it has the new pcpuset field from version 1.6. This is bug - # https://bugs.launchpad.net/nova/+bug/2097359. - self.assertEqual('1.4', topo_loaded.cells[0].VERSION) + # and the version is bumped to 1.6 + self.assertEqual('1.6', topo_loaded.cells[0].VERSION) class TestInstanceNUMATopology(