From 87816ffb2c012063a4de32124790bdf0939dd3e4 Mon Sep 17 00:00:00 2001 From: Neil Sun Date: Thu, 28 Dec 2023 14:08:09 +0800 Subject: [PATCH] Support ignore scheduler extender error when binding Signed-off-by: sunbinnnnn --- pkg/scheduler/framework/extender.go | 1 + pkg/scheduler/schedule_one.go | 11 ++++++++--- pkg/scheduler/schedule_one_test.go | 12 ++++++++++++ 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/pkg/scheduler/framework/extender.go b/pkg/scheduler/framework/extender.go index 9a7a104a17c..e6da687df48 100644 --- a/pkg/scheduler/framework/extender.go +++ b/pkg/scheduler/framework/extender.go @@ -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 } diff --git a/pkg/scheduler/schedule_one.go b/pkg/scheduler/schedule_one.go index c38aca0dd36..ff53daaed70 100644 --- a/pkg/scheduler/schedule_one.go +++ b/pkg/scheduler/schedule_one.go @@ -942,7 +942,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) } @@ -950,15 +950,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 } diff --git a/pkg/scheduler/schedule_one_test.go b/pkg/scheduler/schedule_one_test.go index d83794f660f..02431f5f8fa 100644 --- a/pkg/scheduler/schedule_one_test.go +++ b/pkg/scheduler/schedule_one_test.go @@ -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 {