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