mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-23 11:50:44 +00:00
Make iterateAllProviderTopologyHints generic:
- Remove policy parameters to make this function generic. - Move function out of individual policies and into policy.go
This commit is contained in:
parent
e43f0a5293
commit
adfd11f38f
@ -28,3 +28,41 @@ type Policy interface {
|
||||
// and a Pod Admit Handler Response based on hints and policy type
|
||||
Merge(providersHints []map[string][]TopologyHint) (TopologyHint, lifecycle.PodAdmitResult)
|
||||
}
|
||||
|
||||
// Iterate over all permutations of hints in 'allProviderHints [][]TopologyHint'.
|
||||
//
|
||||
// This procedure is implemented as a recursive function over the set of hints
|
||||
// in 'allproviderHints[i]'. It applies the function 'callback' to each
|
||||
// permutation as it is found. It is the equivalent of:
|
||||
//
|
||||
// for i := 0; i < len(providerHints[0]); i++
|
||||
// for j := 0; j < len(providerHints[1]); j++
|
||||
// for k := 0; k < len(providerHints[2]); k++
|
||||
// ...
|
||||
// for z := 0; z < len(providerHints[-1]); z++
|
||||
// permutation := []TopologyHint{
|
||||
// providerHints[0][i],
|
||||
// providerHints[1][j],
|
||||
// providerHints[2][k],
|
||||
// ...
|
||||
// providerHints[-1][z]
|
||||
// }
|
||||
// callback(permutation)
|
||||
func iterateAllProviderTopologyHints(allProviderHints [][]TopologyHint, callback func([]TopologyHint)) {
|
||||
// Internal helper function to accumulate the permutation before calling the callback.
|
||||
var iterate func(i int, accum []TopologyHint)
|
||||
iterate = func(i int, accum []TopologyHint) {
|
||||
// Base case: we have looped through all providers and have a full permutation.
|
||||
if i == len(allProviderHints) {
|
||||
callback(accum)
|
||||
return
|
||||
}
|
||||
|
||||
// Loop through all hints for provider 'i', and recurse to build the
|
||||
// the permutation of this hint with all hints from providers 'i++'.
|
||||
for j := range allProviderHints[i] {
|
||||
iterate(i+1, append(accum, allProviderHints[i][j]))
|
||||
}
|
||||
}
|
||||
iterate(0, []TopologyHint{})
|
||||
}
|
||||
|
@ -53,44 +53,6 @@ func (p *bestEffortPolicy) Merge(providersHints []map[string][]TopologyHint) (To
|
||||
return hint, admit
|
||||
}
|
||||
|
||||
// Iterate over all permutations of hints in 'allProviderHints [][]TopologyHint'.
|
||||
//
|
||||
// This procedure is implemented as a recursive function over the set of hints
|
||||
// in 'allproviderHints[i]'. It applies the function 'callback' to each
|
||||
// permutation as it is found. It is the equivalent of:
|
||||
//
|
||||
// for i := 0; i < len(providerHints[0]); i++
|
||||
// for j := 0; j < len(providerHints[1]); j++
|
||||
// for k := 0; k < len(providerHints[2]); k++
|
||||
// ...
|
||||
// for z := 0; z < len(providerHints[-1]); z++
|
||||
// permutation := []TopologyHint{
|
||||
// providerHints[0][i],
|
||||
// providerHints[1][j],
|
||||
// providerHints[2][k],
|
||||
// ...
|
||||
// providerHints[-1][z]
|
||||
// }
|
||||
// callback(permutation)
|
||||
func (p *bestEffortPolicy) iterateAllProviderTopologyHints(allProviderHints [][]TopologyHint, callback func([]TopologyHint)) {
|
||||
// Internal helper function to accumulate the permutation before calling the callback.
|
||||
var iterate func(i int, accum []TopologyHint)
|
||||
iterate = func(i int, accum []TopologyHint) {
|
||||
// Base case: we have looped through all providers and have a full permutation.
|
||||
if i == len(allProviderHints) {
|
||||
callback(accum)
|
||||
return
|
||||
}
|
||||
|
||||
// Loop through all hints for provider 'i', and recurse to build the
|
||||
// the permutation of this hint with all hints from providers 'i++'.
|
||||
for j := range allProviderHints[i] {
|
||||
iterate(i+1, append(accum, allProviderHints[i][j]))
|
||||
}
|
||||
}
|
||||
iterate(0, []TopologyHint{})
|
||||
}
|
||||
|
||||
// Merge a TopologyHints permutation to a single hint by performing a bitwise-AND
|
||||
// of their affinity masks. The hint shall be preferred if all hits in the permutation
|
||||
// are preferred.
|
||||
@ -163,7 +125,7 @@ func (p *bestEffortPolicy) mergeProvidersHints(providersHints []map[string][]Top
|
||||
// permutations that have at least one NUMA ID set. If no merged mask can be
|
||||
// found that has at least one NUMA ID set, return the 'defaultAffinity'.
|
||||
bestHint := TopologyHint{defaultAffinity, false}
|
||||
p.iterateAllProviderTopologyHints(allProviderHints, func(permutation []TopologyHint) {
|
||||
iterateAllProviderTopologyHints(allProviderHints, func(permutation []TopologyHint) {
|
||||
// Get the NUMANodeAffinity from each hint in the permutation and see if any
|
||||
// of them encode unpreferred allocations.
|
||||
mergedHint := p.mergePermutation(permutation)
|
||||
|
@ -54,44 +54,6 @@ func (p *singleNumaNodePolicy) canAdmitPodResult(hint *TopologyHint) lifecycle.P
|
||||
}
|
||||
}
|
||||
|
||||
// Iterate over all permutations of hints in 'allProviderHints [][]TopologyHint'.
|
||||
//
|
||||
// This procedure is implemented as a recursive function over the set of hints
|
||||
// in 'allproviderHints[i]'. It applies the function 'callback' to each
|
||||
// permutation as it is found. It is the equivalent of:
|
||||
//
|
||||
// for i := 0; i < len(providerHints[0]); i++
|
||||
// for j := 0; j < len(providerHints[1]); j++
|
||||
// for k := 0; k < len(providerHints[2]); k++
|
||||
// ...
|
||||
// for z := 0; z < len(providerHints[-1]); z++
|
||||
// permutation := []TopologyHint{
|
||||
// providerHints[0][i],
|
||||
// providerHints[1][j],
|
||||
// providerHints[2][k],
|
||||
// ...
|
||||
// providerHints[-1][z]
|
||||
// }
|
||||
// callback(permutation)
|
||||
func (p *singleNumaNodePolicy) iterateAllProviderTopologyHints(allProviderHints [][]TopologyHint, callback func([]TopologyHint)) {
|
||||
// Internal helper function to accumulate the permutation before calling the callback.
|
||||
var iterate func(i int, accum []TopologyHint)
|
||||
iterate = func(i int, accum []TopologyHint) {
|
||||
// Base case: we have looped through all providers and have a full permutation.
|
||||
if i == len(allProviderHints) {
|
||||
callback(accum)
|
||||
return
|
||||
}
|
||||
|
||||
// Loop through all hints for provider 'i', and recurse to build the
|
||||
// the permutation of this hint with all hints from providers 'i++'.
|
||||
for j := range allProviderHints[i] {
|
||||
iterate(i+1, append(accum, allProviderHints[i][j]))
|
||||
}
|
||||
}
|
||||
iterate(0, []TopologyHint{})
|
||||
}
|
||||
|
||||
// Merge a TopologyHints permutation to a single hint by performing a bitwise-AND
|
||||
// of their affinity masks. At this point, all hints have single numa node affinity
|
||||
// and preferred-true.
|
||||
@ -203,7 +165,7 @@ func (p *singleNumaNodePolicy) mergeProvidersHints(providersHints []map[string][
|
||||
// no better hint can be found when merging hints from each hint provider.
|
||||
defaultAffinity, _ := bitmask.NewBitMask(p.numaNodes...)
|
||||
bestHint := TopologyHint{defaultAffinity, false}
|
||||
p.iterateAllProviderTopologyHints(allResourcesHints, func(permutation []TopologyHint) {
|
||||
iterateAllProviderTopologyHints(allResourcesHints, func(permutation []TopologyHint) {
|
||||
mergedHint := p.mergePermutation(permutation)
|
||||
// Only consider mergedHints that result in a NUMANodeAffinity == 1 to
|
||||
// replace the current defaultHint.
|
||||
|
Loading…
Reference in New Issue
Block a user