From 8ad1b5ba3b9be9558bef5213682734891eb1191b Mon Sep 17 00:00:00 2001 From: Louise Daly Date: Fri, 30 Aug 2019 07:12:49 +0100 Subject: [PATCH] Single-numa-node Topology Manager bug fix Added one off fix for single-numa-node policy to correctly reject pod admission on a resource allocation that spans NUMA nodes Co-authored-by: Kevin Klues --- .../cm/topologymanager/topology_manager.go | 5 +++ .../topologymanager/topology_manager_test.go | 36 +++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/pkg/kubelet/cm/topologymanager/topology_manager.go b/pkg/kubelet/cm/topologymanager/topology_manager.go index 94ff447e339..ab54b9be4ce 100644 --- a/pkg/kubelet/cm/topologymanager/topology_manager.go +++ b/pkg/kubelet/cm/topologymanager/topology_manager.go @@ -231,6 +231,11 @@ func (m *manager) calculateAffinity(pod v1.Pod, container v1.Container) Topology if !hint.Preferred { preferred = false } + // Special case PolicySingleNumaNode to only prefer hints where + // all providers have a single NUMA affinity set. + if m.policy != nil && m.policy.Name() == PolicySingleNumaNode && hint.NUMANodeAffinity.Count() > 1 { + preferred = false + } numaAffinities = append(numaAffinities, hint.NUMANodeAffinity) } } diff --git a/pkg/kubelet/cm/topologymanager/topology_manager_test.go b/pkg/kubelet/cm/topologymanager/topology_manager_test.go index cb9127591ba..83e1fd49edd 100644 --- a/pkg/kubelet/cm/topologymanager/topology_manager_test.go +++ b/pkg/kubelet/cm/topologymanager/topology_manager_test.go @@ -111,6 +111,7 @@ func TestCalculateAffinity(t *testing.T) { name string hp []HintProvider expected TopologyHint + policy Policy }{ { name: "TopologyHint not set", @@ -655,10 +656,45 @@ func TestCalculateAffinity(t *testing.T) { Preferred: true, }, }, + { + name: "Special cased PolicySingleNumaNode for single NUMA hint generation", + policy: NewSingleNumaNodePolicy(), + hp: []HintProvider{ + &mockHintProvider{ + map[string][]TopologyHint{ + "resource1": { + { + NUMANodeAffinity: NewTestSocketMask(0, 1), + Preferred: true, + }, + }, + "resource2": { + { + NUMANodeAffinity: NewTestSocketMask(0), + Preferred: true, + }, + { + NUMANodeAffinity: NewTestSocketMask(1), + Preferred: true, + }, + { + NUMANodeAffinity: NewTestSocketMask(0, 1), + Preferred: false, + }, + }, + }, + }, + }, + expected: TopologyHint{ + NUMANodeAffinity: NewTestSocketMask(0), + Preferred: false, + }, + }, } for _, tc := range tcases { mngr := manager{ + policy: tc.policy, hintProviders: tc.hp, numaNodes: numaNodes, }