mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-30 15:05:27 +00:00
Merge pull request #83697 from klueska/fix-single-numa-with-one-provider
Fixed bug in TopologyManager with SingleNUMANode Policy
This commit is contained in:
commit
4561b67971
@ -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.
|
||||||
|
@ -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 {
|
||||||
|
Loading…
Reference in New Issue
Block a user