@@ -29,8 +29,6 @@ import (
29
29
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
30
30
"k8s.io/apimachinery/pkg/fields"
31
31
"k8s.io/apimachinery/pkg/runtime"
32
- "k8s.io/apimachinery/pkg/types"
33
- utilruntime "k8s.io/apimachinery/pkg/util/runtime"
34
32
"k8s.io/apimachinery/pkg/util/sets"
35
33
utilfeature "k8s.io/apiserver/pkg/util/feature"
36
34
"k8s.io/client-go/informers"
@@ -57,11 +55,6 @@ import (
57
55
"k8s.io/kubernetes/pkg/scheduler/profile"
58
56
)
59
57
60
- const (
61
- initialGetBackoff = 100 * time .Millisecond
62
- maximalGetBackoff = time .Minute
63
- )
64
-
65
58
// Binder knows how to write a binding.
66
59
type Binder interface {
67
60
Bind (binding * v1.Binding ) error
@@ -205,7 +198,7 @@ func (c *Configurator) create() (*Scheduler, error) {
205
198
Algorithm : algo ,
206
199
Profiles : profiles ,
207
200
NextPod : internalqueue .MakeNextPodFunc (podQueue ),
208
- Error : MakeDefaultErrorFunc (c .client , podQueue , c .schedulerCache ),
201
+ Error : MakeDefaultErrorFunc (c .client , c . informerFactory . Core (). V1 (). Pods (). Lister (), podQueue , c .schedulerCache ),
209
202
StopEverything : c .StopEverything ,
210
203
SchedulingQueue : podQueue ,
211
204
}, nil
@@ -475,7 +468,7 @@ func NewPodInformer(client clientset.Interface, resyncPeriod time.Duration) core
475
468
}
476
469
477
470
// MakeDefaultErrorFunc construct a function to handle pod scheduler error
478
- func MakeDefaultErrorFunc (client clientset.Interface , podQueue internalqueue.SchedulingQueue , schedulerCache internalcache.Cache ) func (* framework.QueuedPodInfo , error ) {
471
+ func MakeDefaultErrorFunc (client clientset.Interface , podLister corelisters. PodLister , podQueue internalqueue.SchedulingQueue , schedulerCache internalcache.Cache ) func (* framework.QueuedPodInfo , error ) {
479
472
return func (podInfo * framework.QueuedPodInfo , err error ) {
480
473
pod := podInfo .Pod
481
474
if err == core .ErrNoNodesAvailable {
@@ -500,40 +493,17 @@ func MakeDefaultErrorFunc(client clientset.Interface, podQueue internalqueue.Sch
500
493
klog .Errorf ("Error scheduling %v/%v: %v; retrying" , pod .Namespace , pod .Name , err )
501
494
}
502
495
503
- podSchedulingCycle := podQueue .SchedulingCycle ()
504
- // Retry asynchronously.
505
- // Note that this is extremely rudimentary and we need a more real error handling path.
506
- go func () {
507
- defer utilruntime .HandleCrash ()
508
- podID := types.NamespacedName {
509
- Namespace : pod .Namespace ,
510
- Name : pod .Name ,
511
- }
512
-
513
- // Get the pod again; it may have changed/been scheduled already.
514
- getBackoff := initialGetBackoff
515
- for {
516
- pod , err := client .CoreV1 ().Pods (podID .Namespace ).Get (context .TODO (), podID .Name , metav1.GetOptions {})
517
- if err == nil {
518
- if len (pod .Spec .NodeName ) == 0 {
519
- podInfo .Pod = pod
520
- if err := podQueue .AddUnschedulableIfNotPresent (podInfo , podSchedulingCycle ); err != nil {
521
- klog .Error (err )
522
- }
523
- }
524
- break
525
- }
526
- if apierrors .IsNotFound (err ) {
527
- klog .Warningf ("A pod %v no longer exists" , podID )
528
- return
529
- }
530
- klog .Errorf ("Error getting pod %v for retry: %v; retrying..." , podID , err )
531
- if getBackoff = getBackoff * 2 ; getBackoff > maximalGetBackoff {
532
- getBackoff = maximalGetBackoff
533
- }
534
- time .Sleep (getBackoff )
535
- }
536
- }()
496
+ // Check if the Pod exists in informer cache.
497
+ cachedPod , err := podLister .Pods (pod .Namespace ).Get (pod .Name )
498
+ if err != nil {
499
+ klog .Warningf ("Pod %v/%v doesn't exist in informer cache: %v" , pod .Namespace , pod .Name , err )
500
+ return
501
+ }
502
+ // As <cachedPod> is from SharedInformer, we need to do a DeepCopy() here.
503
+ podInfo .Pod = cachedPod .DeepCopy ()
504
+ if err := podQueue .AddUnschedulableIfNotPresent (podInfo , podQueue .SchedulingCycle ()); err != nil {
505
+ klog .Error (err )
506
+ }
537
507
}
538
508
}
539
509
0 commit comments