diff --git a/pkg/scheduler/scheduler.go b/pkg/scheduler/scheduler.go index 2e0dc546b22..fc3863bc91f 100644 --- a/pkg/scheduler/scheduler.go +++ b/pkg/scheduler/scheduler.go @@ -599,9 +599,7 @@ func (sched *Scheduler) scheduleOne(ctx context.Context) { return } pod := podInfo.Pod - if pod.DeletionTimestamp != nil { - sched.Recorder.Eventf(pod, nil, v1.EventTypeWarning, "FailedScheduling", "Scheduling", "skip schedule deleting pod: %v/%v", pod.Namespace, pod.Name) - klog.V(3).Infof("Skip schedule deleting pod: %v/%v", pod.Namespace, pod.Name) + if sched.skipPodSchedule(pod) { return } @@ -764,6 +762,25 @@ func (sched *Scheduler) scheduleOne(ctx context.Context) { }() } +// skipPodSchedule returns true if we could skip scheduling the pod for specified cases. +func (sched *Scheduler) skipPodSchedule(pod *v1.Pod) bool { + // Case 1: pod is being deleted. + if pod.DeletionTimestamp != nil { + sched.Recorder.Eventf(pod, nil, v1.EventTypeWarning, "FailedScheduling", "Scheduling", "skip schedule deleting pod: %v/%v", pod.Namespace, pod.Name) + klog.V(3).Infof("Skip schedule deleting pod: %v/%v", pod.Namespace, pod.Name) + return true + } + + // Case 2: pod has been assumed and pod updates could be skipped. + // An assumed pod can be added again to the scheduling queue if it got an update event + // during its previous scheduling cycle but before getting assumed. + if sched.skipPodUpdate(pod) { + return true + } + + return false +} + type podConditionUpdaterImpl struct { Client clientset.Interface } diff --git a/pkg/scheduler/scheduler_test.go b/pkg/scheduler/scheduler_test.go index 1bb26fe59e8..1343abe3d2d 100644 --- a/pkg/scheduler/scheduler_test.go +++ b/pkg/scheduler/scheduler_test.go @@ -309,6 +309,12 @@ func TestScheduler(t *testing.T) { AssumeFunc: func(pod *v1.Pod) { gotAssumedPod = pod }, + IsAssumedPodFunc: func(pod *v1.Pod) bool { + if pod == nil || gotAssumedPod == nil { + return false + } + return pod.UID == gotAssumedPod.UID + }, } s := &Scheduler{