mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-04 04:08:16 +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:
		@@ -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 {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user