Merge pull request #83697 from klueska/fix-single-numa-with-one-provider

Fixed bug in TopologyManager with SingleNUMANode Policy
This commit is contained in:
Kubernetes Prow Robot 2019-10-10 19:00:33 -07:00 committed by GitHub
commit 4561b67971
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 48 additions and 14 deletions

View File

@ -201,7 +201,7 @@ func (m *manager) calculateAffinity(pod v1.Pod, container v1.Container) Topology
// If hints is nil, insert a single, preferred any-numa hint into allProviderHints. // If hints is nil, insert a single, preferred any-numa hint into allProviderHints.
if len(hints) == 0 { if len(hints) == 0 {
klog.Infof("[topologymanager] Hint Provider has no preference for NUMA affinity with any resource") klog.Infof("[topologymanager] Hint Provider has no preference for NUMA affinity with any resource")
allProviderHints = append(allProviderHints, []TopologyHint{{defaultAffinity, true}}) allProviderHints = append(allProviderHints, []TopologyHint{{nil, true}})
continue continue
} }
@ -209,13 +209,13 @@ func (m *manager) calculateAffinity(pod v1.Pod, container v1.Container) Topology
for resource := range hints { for resource := range hints {
if hints[resource] == nil { if hints[resource] == nil {
klog.Infof("[topologymanager] Hint Provider has no preference for NUMA affinity with resource '%s'", resource) klog.Infof("[topologymanager] Hint Provider has no preference for NUMA affinity with resource '%s'", resource)
allProviderHints = append(allProviderHints, []TopologyHint{{defaultAffinity, true}}) allProviderHints = append(allProviderHints, []TopologyHint{{nil, true}})
continue continue
} }
if len(hints[resource]) == 0 { if len(hints[resource]) == 0 {
klog.Infof("[topologymanager] Hint Provider has no possible NUMA affinities for resource '%s'", resource) klog.Infof("[topologymanager] Hint Provider has no possible NUMA affinities for resource '%s'", resource)
allProviderHints = append(allProviderHints, []TopologyHint{{defaultAffinity, false}}) allProviderHints = append(allProviderHints, []TopologyHint{{nil, false}})
continue continue
} }
@ -235,18 +235,21 @@ func (m *manager) calculateAffinity(pod v1.Pod, container v1.Container) Topology
preferred := true preferred := true
var numaAffinities []bitmask.BitMask var numaAffinities []bitmask.BitMask
for _, hint := range permutation { for _, hint := range permutation {
// Only consider hints that have an actual NUMANodeAffinity set. if hint.NUMANodeAffinity == nil {
if hint.NUMANodeAffinity != nil { numaAffinities = append(numaAffinities, defaultAffinity)
} else {
numaAffinities = append(numaAffinities, hint.NUMANodeAffinity)
}
if !hint.Preferred { if !hint.Preferred {
preferred = false preferred = false
} }
// Special case PolicySingleNumaNode to only prefer hints where // Special case PolicySingleNumaNode to only prefer hints where
// all providers have a single NUMA affinity set. // all providers have a single NUMA affinity set.
if m.policy != nil && m.policy.Name() == PolicySingleNumaNode && hint.NUMANodeAffinity.Count() > 1 { if m.policy != nil && m.policy.Name() == PolicySingleNumaNode && hint.NUMANodeAffinity != nil && hint.NUMANodeAffinity.Count() > 1 {
preferred = false preferred = false
} }
numaAffinities = append(numaAffinities, hint.NUMANodeAffinity)
}
} }
// Merge the affinities using a bitwise-and operation. // Merge the affinities using a bitwise-and operation.

View File

@ -196,7 +196,7 @@ func TestCalculateAffinity(t *testing.T) {
}, },
expected: TopologyHint{ expected: TopologyHint{
NUMANodeAffinity: NewTestBitMask(numaNodes...), NUMANodeAffinity: NewTestBitMask(numaNodes...),
Preferred: true, Preferred: false,
}, },
}, },
{ {
@ -690,6 +690,37 @@ func TestCalculateAffinity(t *testing.T) {
Preferred: false, Preferred: false,
}, },
}, },
{
name: "Special cased PolicySingleNumaNode with one no-preference provider",
policy: NewSingleNumaNodePolicy(),
hp: []HintProvider{
&mockHintProvider{
map[string][]TopologyHint{
"resource1": {
{
NUMANodeAffinity: NewTestBitMask(0),
Preferred: true,
},
{
NUMANodeAffinity: NewTestBitMask(1),
Preferred: true,
},
{
NUMANodeAffinity: NewTestBitMask(0, 1),
Preferred: false,
},
},
},
},
&mockHintProvider{
nil,
},
},
expected: TopologyHint{
NUMANodeAffinity: NewTestBitMask(0),
Preferred: true,
},
},
} }
for _, tc := range tcases { for _, tc := range tcases {