mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-23 11:50:44 +00:00
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:
commit
e24b5333e5
@ -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}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
@ -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)
|
||||||
|
@ -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)
|
||||||
|
@ -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,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user