Merge pull request #108052 from klueska/fix-topology-manager

Fix bug in TopologyManager with merging hints when NUM_NUMA > 2
This commit is contained in:
Kubernetes Prow Robot 2022-02-11 07:37:34 -08:00 committed by GitHub
commit e24b5333e5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 51 additions and 12 deletions

View File

@ -41,12 +41,14 @@ func mergePermutation(numaNodes []int, permutation []TopologyHint) TopologyHint
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. // 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) numaAffinities = append(numaAffinities, hint.NUMANodeAffinity)
// Only mark preferred if all affinities are equal.
if !hint.NUMANodeAffinity.IsEqual(numaAffinities[0]) {
preferred = false
} }
}
// Only mark preferred if all affinities are preferred.
if !hint.Preferred { if !hint.Preferred {
preferred = false preferred = false
} }
@ -54,8 +56,8 @@ func mergePermutation(numaNodes []int, permutation []TopologyHint) TopologyHint
// Merge the affinities using a bitwise-and operation. // Merge the affinities using a bitwise-and operation.
mergedAffinity := bitmask.And(defaultAffinity, numaAffinities...) mergedAffinity := bitmask.And(defaultAffinity, numaAffinities...)
// Build a mergedHint from the merged affinity mask, indicating if an // Build a mergedHint from the merged affinity mask, setting preferred as
// preferred allocation was used to generate the affinity mask or not. // appropriate based on the logic above.
return TopologyHint{mergedAffinity, preferred} return TopologyHint{mergedAffinity, preferred}
} }

View File

@ -50,7 +50,7 @@ func TestPolicyBestEffortCanAdmitPodResult(t *testing.T) {
} }
func TestPolicyBestEffortMerge(t *testing.T) { func TestPolicyBestEffortMerge(t *testing.T) {
numaNodes := []int{0, 1} numaNodes := []int{0, 1, 2, 3}
policy := NewBestEffortPolicy(numaNodes) policy := NewBestEffortPolicy(numaNodes)
tcases := commonPolicyMergeTestCases(numaNodes) tcases := commonPolicyMergeTestCases(numaNodes)

View File

@ -68,7 +68,7 @@ func TestPolicyRestrictedCanAdmitPodResult(t *testing.T) {
} }
func TestPolicyRestrictedMerge(t *testing.T) { func TestPolicyRestrictedMerge(t *testing.T) {
numaNodes := []int{0, 1} numaNodes := []int{0, 1, 2, 3}
policy := NewRestrictedPolicy(numaNodes) policy := NewRestrictedPolicy(numaNodes)
tcases := commonPolicyMergeTestCases(numaNodes) tcases := commonPolicyMergeTestCases(numaNodes)

View File

@ -156,7 +156,7 @@ func TestPolicySingleNumaNodeFilterHints(t *testing.T) {
} }
func TestPolicySingleNumaNodeMerge(t *testing.T) { func TestPolicySingleNumaNodeMerge(t *testing.T) {
numaNodes := []int{0, 1} numaNodes := []int{0, 1, 2, 3}
policy := NewSingleNumaNodePolicy(numaNodes) policy := NewSingleNumaNodePolicy(numaNodes)
tcases := commonPolicyMergeTestCases(numaNodes) tcases := commonPolicyMergeTestCases(numaNodes)

View File

@ -315,6 +315,43 @@ func commonPolicyMergeTestCases(numaNodes []int) []policyMergeTestCase {
func (p *bestEffortPolicy) mergeTestCases(numaNodes []int) []policyMergeTestCase { func (p *bestEffortPolicy) mergeTestCases(numaNodes []int) []policyMergeTestCase {
return []policyMergeTestCase{ return []policyMergeTestCase{
{
name: "Two providers, 2 hints each, same mask (some with different bits), same preferred",
hp: []HintProvider{
&mockHintProvider{
map[string][]TopologyHint{
"resource1": {
{
NUMANodeAffinity: NewTestBitMask(0, 1),
Preferred: true,
},
{
NUMANodeAffinity: NewTestBitMask(0, 2),
Preferred: true,
},
},
},
},
&mockHintProvider{
map[string][]TopologyHint{
"resource2": {
{
NUMANodeAffinity: NewTestBitMask(0, 1),
Preferred: true,
},
{
NUMANodeAffinity: NewTestBitMask(0, 2),
Preferred: true,
},
},
},
},
},
expected: TopologyHint{
NUMANodeAffinity: NewTestBitMask(0, 1),
Preferred: true,
},
},
{ {
name: "TopologyHint not set", name: "TopologyHint not set",
hp: []HintProvider{}, hp: []HintProvider{},
@ -513,7 +550,7 @@ func (p *bestEffortPolicy) mergeTestCases(numaNodes []int) []policyMergeTestCase
}, },
expected: TopologyHint{ expected: TopologyHint{
NUMANodeAffinity: NewTestBitMask(0), NUMANodeAffinity: NewTestBitMask(0),
Preferred: true, Preferred: false,
}, },
}, },
{ {
@ -550,7 +587,7 @@ func (p *bestEffortPolicy) mergeTestCases(numaNodes []int) []policyMergeTestCase
}, },
}, },
{ {
name: "Two providers, 1 hint each, 1 wider mask, both preferred 1/2", name: "Two providers, 1 hint each, 1 wider mask, both preferred 2/2",
hp: []HintProvider{ hp: []HintProvider{
&mockHintProvider{ &mockHintProvider{
map[string][]TopologyHint{ map[string][]TopologyHint{
@ -575,7 +612,7 @@ func (p *bestEffortPolicy) mergeTestCases(numaNodes []int) []policyMergeTestCase
}, },
expected: TopologyHint{ expected: TopologyHint{
NUMANodeAffinity: NewTestBitMask(1), NUMANodeAffinity: NewTestBitMask(1),
Preferred: true, Preferred: false,
}, },
}, },
} }