NUMATopologyFilter raise exception and not continue filter next node
NUMATopologyFilter raise exception and not continue filter next node when there is no wanted pagesize in current filtered host. Catch MemoryPageSizeNotSupported exception to prevent this exception suspend procedure of filter hosts. Change-Id: Ice092c871beeca5de2fa6bbf274240f4db508008 Closes-Bug: 1473308
This commit is contained in:
parent
beb3a9dff5
commit
920586868d
|
@ -23,13 +23,24 @@ from nova.scheduler import driver
|
|||
from nova.scheduler import host_manager
|
||||
|
||||
NUMA_TOPOLOGY = objects.NUMATopology(
|
||||
cells=[objects.NUMACell(
|
||||
id=0, cpuset=set([1, 2]), memory=512,
|
||||
cpu_usage=0, memory_usage=0, mempages=[],
|
||||
cells=[
|
||||
objects.NUMACell(
|
||||
id=0, cpuset=set([1, 2]), memory=512,
|
||||
cpu_usage=0, memory_usage=0, mempages=[
|
||||
objects.NUMAPagesTopology(size_kb=16,
|
||||
total=387184,
|
||||
used=0),
|
||||
objects.NUMAPagesTopology(size_kb=2048,
|
||||
total=512, used=0)],
|
||||
siblings=[], pinned_cpus=set([])),
|
||||
objects.NUMACell(
|
||||
id=1, cpuset=set([3, 4]), memory=512,
|
||||
cpu_usage=0, memory_usage=0, mempages=[],
|
||||
objects.NUMACell(
|
||||
id=1, cpuset=set([3, 4]), memory=512,
|
||||
cpu_usage=0, memory_usage=0, mempages=[
|
||||
objects.NUMAPagesTopology(size_kb=4,
|
||||
total=1548736,
|
||||
used=0),
|
||||
objects.NUMAPagesTopology(size_kb=2048,
|
||||
total=512, used=0)],
|
||||
siblings=[], pinned_cpus=set([]))])
|
||||
|
||||
NUMA_TOPOLOGY_W_HT = objects.NUMATopology(cells=[
|
||||
|
|
|
@ -193,3 +193,33 @@ class TestNUMATopologyFilter(test.NoDBTestCase):
|
|||
fields.CPUThreadAllocationPolicy.ISOLATE]:
|
||||
self._do_test_numa_topology_filter_cpu_policy(
|
||||
numa_topology, cpu_policy, cpu_thread_policy, True)
|
||||
|
||||
def test_numa_topology_filter_pass_mempages(self):
|
||||
instance_topology = objects.InstanceNUMATopology(
|
||||
cells=[objects.InstanceNUMACell(id=0, cpuset=set([3]),
|
||||
memory=128, pagesize=4),
|
||||
objects.InstanceNUMACell(id=1, cpuset=set([1]),
|
||||
memory=128, pagesize=16)
|
||||
])
|
||||
spec_obj = self._get_spec_obj(numa_topology=instance_topology)
|
||||
host = fakes.FakeHostState('host1', 'node1',
|
||||
{'numa_topology': fakes.NUMA_TOPOLOGY,
|
||||
'pci_stats': None,
|
||||
'cpu_allocation_ratio': 16.0,
|
||||
'ram_allocation_ratio': 1.5})
|
||||
self.assertTrue(self.filt_cls.host_passes(host, spec_obj))
|
||||
|
||||
def test_numa_topology_filter_fail_mempages(self):
|
||||
instance_topology = objects.InstanceNUMATopology(
|
||||
cells=[objects.InstanceNUMACell(id=0, cpuset=set([3]),
|
||||
memory=128, pagesize=8),
|
||||
objects.InstanceNUMACell(id=1, cpuset=set([1]),
|
||||
memory=128, pagesize=16)
|
||||
])
|
||||
spec_obj = self._get_spec_obj(numa_topology=instance_topology)
|
||||
host = fakes.FakeHostState('host1', 'node1',
|
||||
{'numa_topology': fakes.NUMA_TOPOLOGY,
|
||||
'pci_stats': None,
|
||||
'cpu_allocation_ratio': 16.0,
|
||||
'ram_allocation_ratio': 1.5})
|
||||
self.assertFalse(self.filt_cls.host_passes(host, spec_obj))
|
||||
|
|
|
@ -1924,6 +1924,33 @@ class VirtMemoryPagesTestCase(test.NoDBTestCase):
|
|||
2048,
|
||||
hw._numa_cell_supports_pagesize_request(host_cell, inst_cell))
|
||||
|
||||
def test_cell_accepts_request_remainder_memory(self):
|
||||
# Test memory can't be divided with no rem by mempage's size_kb
|
||||
inst_cell = objects.InstanceNUMACell(
|
||||
id=0, cpuset=set([0]), memory=1024 + 1, pagesize=2048)
|
||||
host_cell = objects.NUMACell(
|
||||
id=0, cpuset=set([0]), memory=1024, mempages=[
|
||||
objects.NUMAPagesTopology(size_kb=4, total=256, used=0),
|
||||
objects.NUMAPagesTopology(size_kb=2048, total=512, used=0)
|
||||
],
|
||||
siblings=[], pinned_cpus=set([]))
|
||||
self.assertIsNone(hw._numa_cell_supports_pagesize_request(
|
||||
host_cell, inst_cell))
|
||||
|
||||
def test_cell_accepts_request_host_mempages(self):
|
||||
# Test pagesize not in host's mempages
|
||||
inst_cell = objects.InstanceNUMACell(
|
||||
id=0, cpuset=set([0]), memory=1024, pagesize=4096)
|
||||
host_cell = objects.NUMACell(
|
||||
id=0, cpuset=set([0]), memory=1024, mempages=[
|
||||
objects.NUMAPagesTopology(size_kb=4, total=256, used=0),
|
||||
objects.NUMAPagesTopology(size_kb=2048, total=512, used=0)
|
||||
],
|
||||
siblings=[], pinned_cpus=set([]))
|
||||
self.assertRaises(exception.MemoryPageSizeNotSupported,
|
||||
hw._numa_cell_supports_pagesize_request,
|
||||
host_cell, inst_cell)
|
||||
|
||||
|
||||
class _CPUPinningTestCaseBase(object):
|
||||
def assertEqualTopology(self, expected, got):
|
||||
|
|
|
@ -632,6 +632,9 @@ def _numa_cell_supports_pagesize_request(host_cell, inst_cell):
|
|||
:param host_cell: host cell to fit the instance cell onto
|
||||
:param inst_cell: instance cell we want to fit
|
||||
|
||||
:raises: exception.MemoryPageSizeNotSupported if custom page
|
||||
size not supported in host cell.
|
||||
|
||||
:returns: The page size able to be handled by host_cell
|
||||
"""
|
||||
avail_pagesize = [page.size_kb for page in host_cell.mempages]
|
||||
|
@ -1225,8 +1228,14 @@ def numa_fit_instance_to_host(
|
|||
cells = []
|
||||
for host_cell, instance_cell in zip(
|
||||
host_cell_perm, instance_topology.cells):
|
||||
got_cell = _numa_fit_instance_cell(
|
||||
host_cell, instance_cell, limits)
|
||||
try:
|
||||
got_cell = _numa_fit_instance_cell(
|
||||
host_cell, instance_cell, limits)
|
||||
except exception.MemoryPageSizeNotSupported:
|
||||
# This exception will been raised if instance cell's
|
||||
# custom pagesize is not supported with host cell in
|
||||
# _numa_cell_supports_pagesize_request function.
|
||||
break
|
||||
if got_cell is None:
|
||||
break
|
||||
cells.append(got_cell)
|
||||
|
|
Loading…
Reference in New Issue