Skip to content

Commit 45660fd

Browse files
author
nolancon
committed
Add filterProvidersHints function:
- Move initial 'filtering' functionality to generic function filterProvidersHints level policy.go. - Call new function from top level Merge function. - Rename some variables/parameters to reflect changes.
1 parent df9b259 commit 45660fd

File tree

4 files changed

+45
-70
lines changed

4 files changed

+45
-70
lines changed

pkg/kubelet/cm/topologymanager/policy.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ limitations under the License.
1717
package topologymanager
1818

1919
import (
20+
"k8s.io/klog"
2021
"k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/bitmask"
2122
"k8s.io/kubernetes/pkg/kubelet/lifecycle"
2223
)
@@ -59,6 +60,39 @@ func mergePermutation(numaNodes []int, permutation []TopologyHint) TopologyHint
5960
return TopologyHint{mergedAffinity, preferred}
6061
}
6162

63+
func filterProvidersHints(providersHints []map[string][]TopologyHint) [][]TopologyHint {
64+
// Loop through all hint providers and save an accumulated list of the
65+
// hints returned by each hint provider. If no hints are provided, assume
66+
// that provider has no preference for topology-aware allocation.
67+
var allProviderHints [][]TopologyHint
68+
for _, hints := range providersHints {
69+
// If hints is nil, insert a single, preferred any-numa hint into allProviderHints.
70+
if len(hints) == 0 {
71+
klog.Infof("[topologymanager] Hint Provider has no preference for NUMA affinity with any resource")
72+
allProviderHints = append(allProviderHints, []TopologyHint{{nil, true}})
73+
continue
74+
}
75+
76+
// Otherwise, accumulate the hints for each resource type into allProviderHints.
77+
for resource := range hints {
78+
if hints[resource] == nil {
79+
klog.Infof("[topologymanager] Hint Provider has no preference for NUMA affinity with resource '%s'", resource)
80+
allProviderHints = append(allProviderHints, []TopologyHint{{nil, true}})
81+
continue
82+
}
83+
84+
if len(hints[resource]) == 0 {
85+
klog.Infof("[topologymanager] Hint Provider has no possible NUMA affinities for resource '%s'", resource)
86+
allProviderHints = append(allProviderHints, []TopologyHint{{nil, false}})
87+
continue
88+
}
89+
90+
allProviderHints = append(allProviderHints, hints[resource])
91+
}
92+
}
93+
return allProviderHints
94+
}
95+
6296
// Iterate over all permutations of hints in 'allProviderHints [][]TopologyHint'.
6397
//
6498
// This procedure is implemented as a recursive function over the set of hints

pkg/kubelet/cm/topologymanager/policy_best_effort.go

Lines changed: 4 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ limitations under the License.
1717
package topologymanager
1818

1919
import (
20-
"k8s.io/klog"
2120
"k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/bitmask"
2221
"k8s.io/kubernetes/pkg/kubelet/lifecycle"
2322
)
@@ -48,54 +47,25 @@ func (p *bestEffortPolicy) canAdmitPodResult(hint *TopologyHint) lifecycle.PodAd
4847
}
4948

5049
func (p *bestEffortPolicy) Merge(providersHints []map[string][]TopologyHint) (TopologyHint, lifecycle.PodAdmitResult) {
51-
hint := p.mergeProvidersHints(providersHints)
50+
filteredProvidersHints := filterProvidersHints(providersHints)
51+
hint := p.mergeProvidersHints(filteredProvidersHints)
5252
admit := p.canAdmitPodResult(&hint)
5353
return hint, admit
5454
}
5555

5656
// Merge the hints from all hint providers to find the best one.
57-
func (p *bestEffortPolicy) mergeProvidersHints(providersHints []map[string][]TopologyHint) TopologyHint {
57+
func (p *bestEffortPolicy) mergeProvidersHints(filteredHints [][]TopologyHint) TopologyHint {
5858
// Set the default affinity as an any-numa affinity containing the list
5959
// of NUMA Nodes available on this machine.
6060
defaultAffinity, _ := bitmask.NewBitMask(p.numaNodes...)
6161

62-
// Loop through all hint providers and save an accumulated list of the
63-
// hints returned by each hint provider. If no hints are provided, assume
64-
// that provider has no preference for topology-aware allocation.
65-
var allProviderHints [][]TopologyHint
66-
for _, hints := range providersHints {
67-
// If hints is nil, insert a single, preferred any-numa hint into allProviderHints.
68-
if len(hints) == 0 {
69-
klog.Infof("[topologymanager] Hint Provider has no preference for NUMA affinity with any resource")
70-
allProviderHints = append(allProviderHints, []TopologyHint{{nil, true}})
71-
continue
72-
}
73-
74-
// Otherwise, accumulate the hints for each resource type into allProviderHints.
75-
for resource := range hints {
76-
if hints[resource] == nil {
77-
klog.Infof("[topologymanager] Hint Provider has no preference for NUMA affinity with resource '%s'", resource)
78-
allProviderHints = append(allProviderHints, []TopologyHint{{nil, true}})
79-
continue
80-
}
81-
82-
if len(hints[resource]) == 0 {
83-
klog.Infof("[topologymanager] Hint Provider has no possible NUMA affinities for resource '%s'", resource)
84-
allProviderHints = append(allProviderHints, []TopologyHint{{nil, false}})
85-
continue
86-
}
87-
88-
allProviderHints = append(allProviderHints, hints[resource])
89-
}
90-
}
91-
9262
// Iterate over all permutations of hints in 'allProviderHints'. Merge the
9363
// hints in each permutation by taking the bitwise-and of their affinity masks.
9464
// Return the hint with the narrowest NUMANodeAffinity of all merged
9565
// permutations that have at least one NUMA ID set. If no merged mask can be
9666
// found that has at least one NUMA ID set, return the 'defaultAffinity'.
9767
bestHint := TopologyHint{defaultAffinity, false}
98-
iterateAllProviderTopologyHints(allProviderHints, func(permutation []TopologyHint) {
68+
iterateAllProviderTopologyHints(filteredHints, func(permutation []TopologyHint) {
9969
// Get the NUMANodeAffinity from each hint in the permutation and see if any
10070
// of them encode unpreferred allocations.
10171
mergedHint := mergePermutation(p.numaNodes, permutation)

pkg/kubelet/cm/topologymanager/policy_restricted.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,8 @@ func (p *restrictedPolicy) canAdmitPodResult(hint *TopologyHint) lifecycle.PodAd
5252
}
5353

5454
func (p *restrictedPolicy) Merge(providersHints []map[string][]TopologyHint) (TopologyHint, lifecycle.PodAdmitResult) {
55-
hint := p.mergeProvidersHints(providersHints)
55+
filteredHints := filterProvidersHints(providersHints)
56+
hint := p.mergeProvidersHints(filteredHints)
5657
admit := p.canAdmitPodResult(&hint)
5758
return hint, admit
5859
}

pkg/kubelet/cm/topologymanager/policy_single_numa_node.go

Lines changed: 5 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ limitations under the License.
1717
package topologymanager
1818

1919
import (
20-
"k8s.io/klog"
2120
"k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/bitmask"
2221
"k8s.io/kubernetes/pkg/kubelet/lifecycle"
2322
)
@@ -72,49 +71,19 @@ func filterSingleNumaHints(allResourcesHints [][]TopologyHint) [][]TopologyHint
7271
return filteredResourcesHints
7372
}
7473

75-
func (p *singleNumaNodePolicy) mergeProvidersHints(providersHints []map[string][]TopologyHint) TopologyHint {
74+
func (p *singleNumaNodePolicy) mergeProvidersHints(filteredHints [][]TopologyHint) TopologyHint {
7675
// Set the default affinity as an any-numa affinity containing the list
7776
// of NUMA Nodes available on this machine.
7877
defaultAffinity, _ := bitmask.NewBitMask(p.numaNodes...)
7978

80-
// Loop through all provider hints and save an accumulated list of the
81-
// hints returned by each hint provider. If no hints are provided, assume
82-
// that provider has no preference for topology-aware allocation.
83-
var allProviderHints [][]TopologyHint
84-
for _, hints := range providersHints {
85-
// If hints is nil, insert a single, preferred any-numa hint into allProviderHints.
86-
if len(hints) == 0 {
87-
klog.Infof("[topologymanager] Hint Provider has no preference for NUMA affinity with any resource")
88-
allProviderHints = append(allProviderHints, []TopologyHint{{nil, true}})
89-
continue
90-
}
91-
92-
// Otherwise, accumulate the hints for each resource type into allProviderHints.
93-
for resource := range hints {
94-
if hints[resource] == nil {
95-
klog.Infof("[topologymanager] Hint Provider has no preference for NUMA affinity with resource '%s'", resource)
96-
allProviderHints = append(allProviderHints, []TopologyHint{{nil, true}})
97-
continue
98-
}
99-
100-
if len(hints[resource]) == 0 {
101-
klog.Infof("[topologymanager] Hint Provider has no possible NUMA affinities for resource '%s'", resource)
102-
allProviderHints = append(allProviderHints, []TopologyHint{{nil, false}})
103-
continue
104-
}
105-
106-
allProviderHints = append(allProviderHints, hints[resource])
107-
}
108-
}
109-
11079
// Filter to only include don't cares and hints with a single NUMA node.
111-
allProviderHints = filterSingleNumaHints(allProviderHints)
80+
filteredHints = filterSingleNumaHints(filteredHints)
11281

11382
// Set the bestHint to return from this function as {nil false}.
11483
// This will only be returned if no better hint can be found when
11584
// merging hints from each hint provider.
11685
bestHint := TopologyHint{defaultAffinity, false}
117-
iterateAllProviderTopologyHints(allProviderHints, func(permutation []TopologyHint) {
86+
iterateAllProviderTopologyHints(filteredHints, func(permutation []TopologyHint) {
11887
// Get the NUMANodeAffinity from each hint in the permutation and see if any
11988
// of them encode unpreferred allocations.
12089
mergedHint := mergePermutation(p.numaNodes, permutation)
@@ -158,7 +127,8 @@ func (p *singleNumaNodePolicy) mergeProvidersHints(providersHints []map[string][
158127
}
159128

160129
func (p *singleNumaNodePolicy) Merge(providersHints []map[string][]TopologyHint) (TopologyHint, lifecycle.PodAdmitResult) {
161-
hint := p.mergeProvidersHints(providersHints)
130+
filteredHints := filterProvidersHints(providersHints)
131+
hint := p.mergeProvidersHints(filteredHints)
162132
admit := p.canAdmitPodResult(&hint)
163133
return hint, admit
164134
}

0 commit comments

Comments
 (0)