Skip to content

Commit 6933185

Browse files
committed
Save cell socket correctly when updating host NUMA topology
Previously, in numa_usage_from_instance_numa(), any new NUMACell objects we created did not have the `socket` attribute. In some cases this was persisted all the way down to the database. Fix this by copying `socket` from the old_cell. Change-Id: I9ed3c31ccd3220b02d951fc6dbc5ea049a240a68 Closes-Bug: 1995153 (cherry picked from commit 04ebae9) (cherry picked from commit acb5116)
1 parent d9dfd0e commit 6933185

File tree

6 files changed

+53
-19
lines changed

6 files changed

+53
-19
lines changed

nova/tests/functional/regressions/test_bug_1995153.py

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -68,16 +68,17 @@ def setUp(self):
6868
side_effect=host_pass_mock)).mock
6969

7070
def test_socket_policy_bug_1995153(self):
71-
"""The numa_usage_from_instance_numa() method in hardware.py saves the
72-
host NUMAToplogy object with NUMACells that have no `socket` set. This
73-
was an omission in the original implementation of the `socket` PCI NUMA
74-
affinity policy. The consequence is that any code path that calls into
75-
numa_usage_from_instance_numa() will clobber the host NUMA topology in
76-
the database with a socket-less version. Booting an instance with NUMA
77-
toplogy will do that, for example. If then a second instance is booted
78-
with the `socket` PCI NUMA affinity policy, it will read the
79-
socket-less host NUMATopology from the database, and error out with a
80-
NotImplementedError. This is bug 1995153.
71+
"""Previously, the numa_usage_from_instance_numa() method in
72+
hardware.py saved the host NUMAToplogy object with NUMACells that have
73+
no `socket` set. This was an omission in the original implementation of
74+
the `socket` PCI NUMA affinity policy. The consequence was that any
75+
code path that called into numa_usage_from_instance_numa() would
76+
clobber the host NUMA topology in the database with a socket-less
77+
version. Booting an instance with NUMA toplogy would do that, for
78+
example. If then a second instance was booted with the `socket` PCI
79+
NUMA affinity policy, it would read the socket-less host NUMATopology
80+
from the database, and error out with a NotImplementedError. This was
81+
bug 1995153. Demonstrate that this is fixed.
8182
"""
8283
host_info = fakelibvirt.HostInfo(
8384
cpu_nodes=2, cpu_sockets=1, cpu_cores=2, cpu_threads=2,
@@ -92,18 +93,15 @@ def test_socket_policy_bug_1995153(self):
9293
'pci_passthrough:alias': '%s:1' % self.ALIAS_NAME,
9394
'hw:pci_numa_affinity_policy': 'socket'
9495
}
95-
# Boot a first instance with a guest NUMA topology to run the buggy
96-
# code in numa_usage_from_instance_numa() and save the socket-less host
97-
# NUMATopology to the database.
96+
# Boot a first instance with a guest NUMA topology to run the
97+
# numa_usage_from_instance_numa() and update the host NUMATopology in
98+
# the database.
9899
self._create_server(
99100
flavor_id=self._create_flavor(
100101
extra_spec={'hw:cpu_policy': 'dedicated'}))
101102

102-
# FIXME(artom) Attempt to boot an instance with the `socket` PCI NUMA
103-
# affinity policy and observe the fireworks.
103+
# Boot an instance with the `socket` PCI NUMA affinity policy and
104+
# assert that it boots correctly now.
104105
flavor_id = self._create_flavor(extra_spec=extra_spec)
105-
server = self._create_server(flavor_id=flavor_id,
106-
expected_state='ERROR')
107-
self.assertIn('fault', server)
108-
self.assertIn('NotImplementedError', server['fault']['message'])
106+
self._create_server(flavor_id=flavor_id)
109107
self.assertTrue(self.mock_filter.called)

nova/tests/unit/compute/test_compute.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5670,6 +5670,7 @@ def test_confirm_resize_with_numa_topology_and_cpu_pinning(
56705670
pagesize=2048,
56715671
cpu_usage=2,
56725672
memory_usage=0,
5673+
socket=0,
56735674
pinned_cpus=set([1, 2]),
56745675
siblings=[set([1]), set([2])],
56755676
mempages=[objects.NUMAPagesTopology(
@@ -5685,6 +5686,7 @@ def test_confirm_resize_with_numa_topology_and_cpu_pinning(
56855686
pagesize=2048,
56865687
memory_usage=0,
56875688
cpu_usage=0,
5689+
socket=0,
56885690
siblings=[set([3]), set([4])],
56895691
mempages=[objects.NUMAPagesTopology(
56905692
size_kb=2048, total=256, used=0)])

nova/tests/unit/compute/test_resource_tracker.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,7 @@
179179
memory=_2MB,
180180
cpu_usage=0,
181181
memory_usage=0,
182+
socket=0,
182183
mempages=[_NUMA_PAGE_TOPOLOGIES['2mb*1024']],
183184
siblings=[set([1]), set([2])],
184185
pinned_cpus=set()),
@@ -189,6 +190,7 @@
189190
memory=_2MB,
190191
cpu_usage=0,
191192
memory_usage=0,
193+
socket=0,
192194
mempages=[_NUMA_PAGE_TOPOLOGIES['2mb*1024']],
193195
siblings=[set([3]), set([4])],
194196
pinned_cpus=set())]),

nova/tests/unit/scheduler/fakes.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
memory=512,
3535
cpu_usage=0,
3636
memory_usage=0,
37+
socket=0,
3738
pinned_cpus=set(),
3839
mempages=[
3940
objects.NUMAPagesTopology(size_kb=16, total=387184, used=0),
@@ -46,6 +47,7 @@
4647
memory=512,
4748
cpu_usage=0,
4849
memory_usage=0,
50+
socket=0,
4951
pinned_cpus=set(),
5052
mempages=[
5153
objects.NUMAPagesTopology(size_kb=4, total=1548736, used=0),

nova/tests/unit/virt/test_hardware.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2023,6 +2023,7 @@ def test_host_usage_contiguous(self):
20232023
memory=256,
20242024
cpu_usage=0,
20252025
memory_usage=0,
2026+
socket=0,
20262027
pinned_cpus=set(),
20272028
mempages=[
20282029
objects.NUMAPagesTopology(size_kb=4, total=32768, used=0),
@@ -2036,6 +2037,7 @@ def test_host_usage_contiguous(self):
20362037
memory=256,
20372038
cpu_usage=0,
20382039
memory_usage=0,
2040+
socket=1,
20392041
pinned_cpus=set(),
20402042
mempages=[
20412043
objects.NUMAPagesTopology(size_kb=4, total=32768, used=64),
@@ -2049,6 +2051,7 @@ def test_host_usage_contiguous(self):
20492051
memory=2,
20502052
cpu_usage=0,
20512053
memory_usage=0,
2054+
socket=2,
20522055
pinned_cpus=set(),
20532056
mempages=[
20542057
objects.NUMAPagesTopology(size_kb=4, total=512, used=16)],
@@ -2130,6 +2133,7 @@ def test_host_usage_contiguous_pages_compute(self):
21302133
memory=160,
21312134
cpu_usage=0,
21322135
memory_usage=0,
2136+
socket=0,
21332137
pinned_cpus=set(),
21342138
mempages=[
21352139
objects.NUMAPagesTopology(size_kb=4, total=32768, used=32),
@@ -2170,6 +2174,7 @@ def test_host_usage_sparse(self):
21702174
memory=1024,
21712175
cpu_usage=0,
21722176
memory_usage=0,
2177+
socket=0,
21732178
pinned_cpus=set(),
21742179
mempages=[
21752180
objects.NUMAPagesTopology(size_kb=4, total=512, used=0)],
@@ -2181,6 +2186,7 @@ def test_host_usage_sparse(self):
21812186
memory=512,
21822187
cpu_usage=0,
21832188
memory_usage=0,
2189+
socket=0,
21842190
pinned_cpus=set(),
21852191
mempages=[
21862192
objects.NUMAPagesTopology(size_kb=4, total=512, used=0)],
@@ -2192,6 +2198,7 @@ def test_host_usage_sparse(self):
21922198
memory=512,
21932199
cpu_usage=0,
21942200
memory_usage=0,
2201+
socket=0,
21952202
pinned_cpus=set(),
21962203
mempages=[
21972204
objects.NUMAPagesTopology(size_kb=4, total=512, used=0)],
@@ -2258,6 +2265,7 @@ def test_host_usage_cumulative_with_free(self):
22582265
memory=1024,
22592266
cpu_usage=2,
22602267
memory_usage=512,
2268+
socket=0,
22612269
mempages=[
22622270
objects.NUMAPagesTopology(size_kb=4, total=512, used=0)],
22632271
siblings=[set([0]), set([1]), set([2]), set([3])],
@@ -2269,6 +2277,7 @@ def test_host_usage_cumulative_with_free(self):
22692277
memory=512,
22702278
cpu_usage=1,
22712279
memory_usage=512,
2280+
socket=0,
22722281
pinned_cpus=set(),
22732282
mempages=[
22742283
objects.NUMAPagesTopology(size_kb=4, total=512, used=0)],
@@ -2280,6 +2289,7 @@ def test_host_usage_cumulative_with_free(self):
22802289
memory=256,
22812290
cpu_usage=0,
22822291
memory_usage=0,
2292+
socket=0,
22832293
pinned_cpus=set(),
22842294
mempages=[
22852295
objects.NUMAPagesTopology(size_kb=4, total=512, used=0)],
@@ -2330,6 +2340,7 @@ def _topo_usage_reserved_page_size(self):
23302340
memory=512,
23312341
cpu_usage=0,
23322342
memory_usage=0,
2343+
socket=0,
23332344
pinned_cpus=set(),
23342345
mempages=[objects.NUMAPagesTopology(
23352346
size_kb=2048, total=512, used=128,
@@ -2342,6 +2353,7 @@ def _topo_usage_reserved_page_size(self):
23422353
memory=512,
23432354
cpu_usage=0,
23442355
memory_usage=0,
2356+
socket=0,
23452357
pinned_cpus=set(),
23462358
mempages=[objects.NUMAPagesTopology(
23472359
size_kb=1048576, total=5, used=2,
@@ -2606,6 +2618,7 @@ def setUp(self):
26062618
memory=2048,
26072619
cpu_usage=2,
26082620
memory_usage=2048,
2621+
socket=0,
26092622
pinned_cpus=set(),
26102623
mempages=[objects.NUMAPagesTopology(
26112624
size_kb=4, total=524288, used=0)],
@@ -2616,6 +2629,7 @@ def setUp(self):
26162629
memory=2048,
26172630
cpu_usage=2,
26182631
memory_usage=2048,
2632+
socket=0,
26192633
pinned_cpus=set(),
26202634
mempages=[objects.NUMAPagesTopology(
26212635
size_kb=4, total=524288, used=0)],
@@ -4160,6 +4174,7 @@ def test_cpu_pinning_usage_from_instances(self):
41604174
memory=4096,
41614175
cpu_usage=0,
41624176
memory_usage=0,
4177+
socket=0,
41634178
pinned_cpus=set(),
41644179
siblings=[set([0]), set([1]), set([2]), set([3])],
41654180
mempages=[objects.NUMAPagesTopology(
@@ -4189,6 +4204,7 @@ def test_cpu_pinning_usage_from_instances_free(self):
41894204
memory=4096,
41904205
cpu_usage=0,
41914206
memory_usage=0,
4207+
socket=0,
41924208
pinned_cpus=set([0, 1, 3]),
41934209
mempages=[objects.NUMAPagesTopology(
41944210
size_kb=4, total=524288, used=0)],
@@ -4218,6 +4234,7 @@ def test_host_usage_from_instances_fail(self):
42184234
memory=4096,
42194235
cpu_usage=0,
42204236
memory_usage=0,
4237+
socket=0,
42214238
pinned_cpus=set(),
42224239
siblings=[set([0]), set([1]), set([2]), set([3])],
42234240
mempages=[objects.NUMAPagesTopology(
@@ -4246,6 +4263,7 @@ def test_host_usage_from_instances_isolate(self):
42464263
memory=4096,
42474264
cpu_usage=0,
42484265
memory_usage=0,
4266+
socket=0,
42494267
pinned_cpus=set(),
42504268
siblings=[set([0, 2]), set([1, 3])],
42514269
mempages=[objects.NUMAPagesTopology(
@@ -4272,6 +4290,7 @@ def test_host_usage_from_instances_isolate_free(self):
42724290
memory=4096,
42734291
cpu_usage=0,
42744292
memory_usage=0,
4293+
socket=0,
42754294
pinned_cpus=set([0, 1, 2, 3]),
42764295
siblings=[set([0, 2]), set([1, 3])],
42774296
mempages=[objects.NUMAPagesTopology(
@@ -4298,6 +4317,7 @@ def test_host_usage_from_instances_isolated_without_siblings(self):
42984317
memory=4096,
42994318
cpu_usage=0,
43004319
memory_usage=0,
4320+
socket=0,
43014321
pinned_cpus=set(),
43024322
siblings=[set([0]), set([1]), set([2]), set([3])],
43034323
mempages=[objects.NUMAPagesTopology(
@@ -4324,6 +4344,7 @@ def test_host_usage_from_instances_isolated_without_siblings_free(self):
43244344
memory=4096,
43254345
cpu_usage=0,
43264346
memory_usage=0,
4347+
socket=0,
43274348
pinned_cpus=set([0, 1, 2, 3]),
43284349
siblings=[set([0]), set([1]), set([2]), set([3])],
43294350
mempages=[objects.NUMAPagesTopology(
@@ -4353,6 +4374,7 @@ def test_host_usage_from_mixed_instance(self):
43534374
memory=4096,
43544375
cpu_usage=0,
43554376
memory_usage=0,
4377+
socket=0,
43564378
pinned_cpus=set([2]),
43574379
siblings=[set([0, 4]), set([1, 5]), set([2, 6]), set([3, 7])],
43584380
mempages=[objects.NUMAPagesTopology(
@@ -4383,6 +4405,7 @@ def test_host_usage_from_mixed_instance_free(self):
43834405
memory=4096,
43844406
cpu_usage=2,
43854407
memory_usage=0,
4408+
socket=0,
43864409
pinned_cpus=set([2, 6, 7]),
43874410
siblings=[set([0, 4]), set([1, 5]), set([2, 6]), set([3, 7])],
43884411
mempages=[objects.NUMAPagesTopology(
@@ -4415,6 +4438,7 @@ def test_host_usage_from_mixed_instance_emu_isolate(self):
44154438
cpu_usage=2,
44164439
memory_usage=0,
44174440
pinned_cpus=set(),
4441+
socket=0,
44184442
siblings=[{cpu} for cpu in range(8)],
44194443
mempages=[objects.NUMAPagesTopology(
44204444
size_kb=4, total=524288, used=0)]
@@ -4448,6 +4472,7 @@ def test_host_usage_from_mixed_instance_emu_isolate_free(self):
44484472
memory=4096,
44494473
cpu_usage=2,
44504474
memory_usage=0,
4475+
socket=0,
44514476
pinned_cpus=set([0, 1, 2, 3]),
44524477
siblings=[{cpu} for cpu in range(8)],
44534478
mempages=[objects.NUMAPagesTopology(
@@ -4490,6 +4515,7 @@ def test_host_usage_from_mixed_instance_cpu_isolate(self):
44904515
memory=4096,
44914516
cpu_usage=2,
44924517
memory_usage=0,
4518+
socket=0,
44934519
pinned_cpus=set(),
44944520
siblings=[set([0, 5]), set([1, 6]), set([2, 7]), set([3, 8]),
44954521
set([4, 9])],
@@ -4529,6 +4555,7 @@ def test_host_usage_from_mixed_instance_cpu_isolate_free(self):
45294555
memory=4096,
45304556
cpu_usage=2,
45314557
memory_usage=0,
4558+
socket=0,
45324559
pinned_cpus=set([0, 1, 2, 5, 6, 7]),
45334560
siblings=[set([0, 5]), set([1, 6]), set([2, 7]), set([3, 8]),
45344561
set([4, 9])],
@@ -4764,6 +4791,7 @@ def _host_topology():
47644791
memory=2048,
47654792
cpu_usage=0,
47664793
memory_usage=0,
4794+
socket=0,
47674795
pinned_cpus=set(),
47684796
siblings=[set([0]), set([1])],
47694797
mempages=[objects.NUMAPagesTopology(
@@ -4775,6 +4803,7 @@ def _host_topology():
47754803
memory=2048,
47764804
cpu_usage=0,
47774805
memory_usage=0,
4806+
socket=0,
47784807
pinned_cpus=set(),
47794808
siblings=[set([2]), set([3])],
47804809
mempages=[objects.NUMAPagesTopology(

nova/virt/hardware.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2566,6 +2566,7 @@ def numa_usage_from_instance_numa(host_topology, instance_topology,
25662566
cpuset=host_cell.cpuset,
25672567
pcpuset=host_cell.pcpuset,
25682568
memory=host_cell.memory,
2569+
socket=host_cell.socket,
25692570
cpu_usage=0,
25702571
memory_usage=0,
25712572
mempages=host_cell.mempages,

0 commit comments

Comments
 (0)