Merge pull request #122503 from sunbinnnnn/scheduler-extender-support-ignore-bind
Support ignore scheduler extender error when binding
This commit is contained in:
		@@ -71,5 +71,6 @@ type Extender interface {
 | 
			
		||||
 | 
			
		||||
	// IsIgnorable returns true indicates scheduling should not fail when this extender
 | 
			
		||||
	// is unavailable. This gives scheduler ability to fail fast and tolerate non-critical extenders as well.
 | 
			
		||||
	// Both Filter and Bind actions are supported.
 | 
			
		||||
	IsIgnorable() bool
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -944,7 +944,7 @@ func (sched *Scheduler) bind(ctx context.Context, fwk framework.Framework, assum
 | 
			
		||||
		sched.finishBinding(logger, fwk, assumed, targetNode, status)
 | 
			
		||||
	}()
 | 
			
		||||
 | 
			
		||||
	bound, err := sched.extendersBinding(assumed, targetNode)
 | 
			
		||||
	bound, err := sched.extendersBinding(logger, assumed, targetNode)
 | 
			
		||||
	if bound {
 | 
			
		||||
		return framework.AsStatus(err)
 | 
			
		||||
	}
 | 
			
		||||
@@ -952,15 +952,20 @@ func (sched *Scheduler) bind(ctx context.Context, fwk framework.Framework, assum
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TODO(#87159): Move this to a Plugin.
 | 
			
		||||
func (sched *Scheduler) extendersBinding(pod *v1.Pod, node string) (bool, error) {
 | 
			
		||||
func (sched *Scheduler) extendersBinding(logger klog.Logger, pod *v1.Pod, node string) (bool, error) {
 | 
			
		||||
	for _, extender := range sched.Extenders {
 | 
			
		||||
		if !extender.IsBinder() || !extender.IsInterested(pod) {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		return true, extender.Bind(&v1.Binding{
 | 
			
		||||
		err := extender.Bind(&v1.Binding{
 | 
			
		||||
			ObjectMeta: metav1.ObjectMeta{Namespace: pod.Namespace, Name: pod.Name, UID: pod.UID},
 | 
			
		||||
			Target:     v1.ObjectReference{Kind: "Node", Name: node},
 | 
			
		||||
		})
 | 
			
		||||
		if err != nil && extender.IsIgnorable() {
 | 
			
		||||
			logger.Info("Skipping extender in bind as it returned error and has ignorable flag set", "extender", extender, "err", err)
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		return true, err
 | 
			
		||||
	}
 | 
			
		||||
	return false, nil
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -92,6 +92,7 @@ type fakeExtender struct {
 | 
			
		||||
	ignorable         bool
 | 
			
		||||
	gotBind           bool
 | 
			
		||||
	isPrioritizer     bool
 | 
			
		||||
	errBind           bool
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (f *fakeExtender) Name() string {
 | 
			
		||||
@@ -127,6 +128,9 @@ func (f *fakeExtender) Prioritize(
 | 
			
		||||
 | 
			
		||||
func (f *fakeExtender) Bind(binding *v1.Binding) error {
 | 
			
		||||
	if f.isBinder {
 | 
			
		||||
		if f.errBind {
 | 
			
		||||
			return errors.New("bind error")
 | 
			
		||||
		}
 | 
			
		||||
		f.gotBind = true
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
@@ -1223,6 +1227,14 @@ func TestSchedulerBinding(t *testing.T) {
 | 
			
		||||
			},
 | 
			
		||||
			wantBinderID: -1, // default binding.
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name:    "ignore when extender bind failed",
 | 
			
		||||
			podName: "pod1",
 | 
			
		||||
			extenders: []framework.Extender{
 | 
			
		||||
				&fakeExtender{isBinder: true, errBind: true, interestedPodName: "pod1", ignorable: true},
 | 
			
		||||
			},
 | 
			
		||||
			wantBinderID: -1, // default binding.
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, test := range table {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user