mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-06 10:43:56 +00:00
fix(scheduler): fix incorrect loop logic in MultiPoint to avoid a plugin being loaded multiple times
Signed-off-by: caohe <caohe9603@gmail.com>
This commit is contained in:
parent
ad9b60e2c9
commit
1f5738df84
@ -37,6 +37,7 @@ import (
|
|||||||
"k8s.io/kubernetes/pkg/scheduler/framework"
|
"k8s.io/kubernetes/pkg/scheduler/framework"
|
||||||
"k8s.io/kubernetes/pkg/scheduler/framework/parallelize"
|
"k8s.io/kubernetes/pkg/scheduler/framework/parallelize"
|
||||||
"k8s.io/kubernetes/pkg/scheduler/metrics"
|
"k8s.io/kubernetes/pkg/scheduler/metrics"
|
||||||
|
"k8s.io/kubernetes/pkg/util/slice"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@ -526,7 +527,7 @@ func (f *frameworkImpl) expandMultiPointPlugins(logger klog.Logger, profile *con
|
|||||||
// - part 3: other plugins (excluded by part 1 & 2) in regular extension point.
|
// - part 3: other plugins (excluded by part 1 & 2) in regular extension point.
|
||||||
newPlugins := reflect.New(reflect.TypeOf(e.slicePtr).Elem()).Elem()
|
newPlugins := reflect.New(reflect.TypeOf(e.slicePtr).Elem()).Elem()
|
||||||
// part 1
|
// part 1
|
||||||
for _, name := range enabledSet.list {
|
for _, name := range slice.CopyStrings(enabledSet.list) {
|
||||||
if overridePlugins.has(name) {
|
if overridePlugins.has(name) {
|
||||||
newPlugins = reflect.Append(newPlugins, reflect.ValueOf(pluginsMap[name]))
|
newPlugins = reflect.Append(newPlugins, reflect.ValueOf(pluginsMap[name]))
|
||||||
enabledSet.delete(name)
|
enabledSet.delete(name)
|
||||||
|
@ -46,6 +46,7 @@ const (
|
|||||||
scoreWithNormalizePlugin1 = "score-with-normalize-plugin-1"
|
scoreWithNormalizePlugin1 = "score-with-normalize-plugin-1"
|
||||||
scoreWithNormalizePlugin2 = "score-with-normalize-plugin-2"
|
scoreWithNormalizePlugin2 = "score-with-normalize-plugin-2"
|
||||||
scorePlugin1 = "score-plugin-1"
|
scorePlugin1 = "score-plugin-1"
|
||||||
|
scorePlugin2 = "score-plugin-2"
|
||||||
pluginNotImplementingScore = "plugin-not-implementing-score"
|
pluginNotImplementingScore = "plugin-not-implementing-score"
|
||||||
preFilterPluginName = "prefilter-plugin"
|
preFilterPluginName = "prefilter-plugin"
|
||||||
preFilterWithExtensionsPluginName = "prefilter-with-extensions-plugin"
|
preFilterWithExtensionsPluginName = "prefilter-with-extensions-plugin"
|
||||||
@ -100,6 +101,14 @@ func newScorePlugin1(_ context.Context, injArgs runtime.Object, f framework.Hand
|
|||||||
return &TestScorePlugin{scorePlugin1, inj}, nil
|
return &TestScorePlugin{scorePlugin1, inj}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func newScorePlugin2(_ context.Context, injArgs runtime.Object, f framework.Handle) (framework.Plugin, error) {
|
||||||
|
var inj injectedResult
|
||||||
|
if err := DecodeInto(injArgs, &inj); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &TestScorePlugin{scorePlugin2, inj}, nil
|
||||||
|
}
|
||||||
|
|
||||||
func newPluginNotImplementingScore(_ context.Context, _ runtime.Object, _ framework.Handle) (framework.Plugin, error) {
|
func newPluginNotImplementingScore(_ context.Context, _ runtime.Object, _ framework.Handle) (framework.Plugin, error) {
|
||||||
return &PluginNotImplementingScore{}, nil
|
return &PluginNotImplementingScore{}, nil
|
||||||
}
|
}
|
||||||
@ -358,11 +367,13 @@ func (t TestBindPlugin) Bind(ctx context.Context, state *framework.CycleState, p
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// nolint:errcheck // Ignore the error returned by Register as before
|
||||||
var registry = func() Registry {
|
var registry = func() Registry {
|
||||||
r := make(Registry)
|
r := make(Registry)
|
||||||
r.Register(scoreWithNormalizePlugin1, newScoreWithNormalizePlugin1)
|
r.Register(scoreWithNormalizePlugin1, newScoreWithNormalizePlugin1)
|
||||||
r.Register(scoreWithNormalizePlugin2, newScoreWithNormalizePlugin2)
|
r.Register(scoreWithNormalizePlugin2, newScoreWithNormalizePlugin2)
|
||||||
r.Register(scorePlugin1, newScorePlugin1)
|
r.Register(scorePlugin1, newScorePlugin1)
|
||||||
|
r.Register(scorePlugin2, newScorePlugin2)
|
||||||
r.Register(pluginNotImplementingScore, newPluginNotImplementingScore)
|
r.Register(pluginNotImplementingScore, newPluginNotImplementingScore)
|
||||||
r.Register(duplicatePluginName, newDuplicatePlugin)
|
r.Register(duplicatePluginName, newDuplicatePlugin)
|
||||||
r.Register(testPlugin, newTestPlugin)
|
r.Register(testPlugin, newTestPlugin)
|
||||||
@ -826,6 +837,44 @@ func TestNewFrameworkMultiPointExpansion(t *testing.T) {
|
|||||||
},
|
},
|
||||||
wantErr: "already registered",
|
wantErr: "already registered",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "Override MultiPoint plugins weights and avoid a plugin being loaded multiple times",
|
||||||
|
plugins: &config.Plugins{
|
||||||
|
MultiPoint: config.PluginSet{
|
||||||
|
Enabled: []config.Plugin{
|
||||||
|
{Name: testPlugin},
|
||||||
|
{Name: scorePlugin1},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Score: config.PluginSet{
|
||||||
|
Enabled: []config.Plugin{
|
||||||
|
{Name: scorePlugin1, Weight: 5},
|
||||||
|
{Name: scorePlugin2, Weight: 5},
|
||||||
|
{Name: testPlugin, Weight: 3},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
wantPlugins: &config.Plugins{
|
||||||
|
QueueSort: config.PluginSet{Enabled: []config.Plugin{{Name: testPlugin}}},
|
||||||
|
PreFilter: config.PluginSet{Enabled: []config.Plugin{{Name: testPlugin}}},
|
||||||
|
Filter: config.PluginSet{Enabled: []config.Plugin{{Name: testPlugin}}},
|
||||||
|
PostFilter: config.PluginSet{Enabled: []config.Plugin{{Name: testPlugin}}},
|
||||||
|
PreScore: config.PluginSet{Enabled: []config.Plugin{
|
||||||
|
{Name: testPlugin},
|
||||||
|
{Name: scorePlugin1},
|
||||||
|
}},
|
||||||
|
Score: config.PluginSet{Enabled: []config.Plugin{
|
||||||
|
{Name: scorePlugin1, Weight: 5},
|
||||||
|
{Name: testPlugin, Weight: 3},
|
||||||
|
{Name: scorePlugin2, Weight: 5},
|
||||||
|
}},
|
||||||
|
Reserve: config.PluginSet{Enabled: []config.Plugin{{Name: testPlugin}}},
|
||||||
|
Permit: config.PluginSet{Enabled: []config.Plugin{{Name: testPlugin}}},
|
||||||
|
PreBind: config.PluginSet{Enabled: []config.Plugin{{Name: testPlugin}}},
|
||||||
|
Bind: config.PluginSet{Enabled: []config.Plugin{{Name: testPlugin}}},
|
||||||
|
PostBind: config.PluginSet{Enabled: []config.Plugin{{Name: testPlugin}}},
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, tc := range tests {
|
for _, tc := range tests {
|
||||||
|
Loading…
Reference in New Issue
Block a user