diff --git a/plugin/pkg/scheduler/scheduler.go b/plugin/pkg/scheduler/scheduler.go index 240048a52ca..3b70c6362fa 100644 --- a/plugin/pkg/scheduler/scheduler.go +++ b/plugin/pkg/scheduler/scheduler.go @@ -185,14 +185,14 @@ func (sched *Scheduler) schedule(pod *v1.Pod) (string, error) { } // assume signals to the cache that a pod is already in the cache, so that binding can be asnychronous. -func (sched *Scheduler) assume(pod *v1.Pod, host string) error { +// assume modifies `assumed`. +func (sched *Scheduler) assume(assumed *v1.Pod, host string) error { // Optimistically assume that the binding will succeed and send it to apiserver // in the background. // If the binding fails, scheduler will release resources allocated to assumed pod // immediately. - assumed := *pod assumed.Spec.NodeName = host - if err := sched.config.SchedulerCache.AssumePod(&assumed); err != nil { + if err := sched.config.SchedulerCache.AssumePod(assumed); err != nil { glog.Errorf("scheduler cache AssumePod failed: %v", err) // TODO: This means that a given pod is already in cache (which means it // is either assumed or already added). This is most probably result of a @@ -207,7 +207,7 @@ func (sched *Scheduler) assume(pod *v1.Pod, host string) error { // predicates in equivalence cache. // If the binding fails, these invalidated item will not break anything. if sched.config.Ecache != nil { - sched.config.Ecache.InvalidateCachedPredicateItemForPodAdd(pod, host) + sched.config.Ecache.InvalidateCachedPredicateItemForPodAdd(assumed, host) } return nil } @@ -264,15 +264,17 @@ func (sched *Scheduler) scheduleOne() { // Tell the cache to assume that a pod now is running on a given node, even though it hasn't been bound yet. // This allows us to keep scheduling without waiting on binding to occur. - err = sched.assume(pod, suggestedHost) + assumedPod := *pod + // assume modifies `assumedPod` by setting NodeName=suggestedHost + err = sched.assume(&assumedPod, suggestedHost) if err != nil { return } // bind the pod to its host asynchronously (we can do this b/c of the assumption step above). go func() { - err := sched.bind(pod, &v1.Binding{ - ObjectMeta: metav1.ObjectMeta{Namespace: pod.Namespace, Name: pod.Name, UID: pod.UID}, + err := sched.bind(&assumedPod, &v1.Binding{ + ObjectMeta: metav1.ObjectMeta{Namespace: assumedPod.Namespace, Name: assumedPod.Name, UID: assumedPod.UID}, Target: v1.ObjectReference{ Kind: "Node", Name: suggestedHost, diff --git a/plugin/pkg/scheduler/scheduler_test.go b/plugin/pkg/scheduler/scheduler_test.go index 65d62e5b2f2..8febe8f9b24 100644 --- a/plugin/pkg/scheduler/scheduler_test.go +++ b/plugin/pkg/scheduler/scheduler_test.go @@ -115,6 +115,7 @@ func TestScheduler(t *testing.T) { sendPod *v1.Pod algo algorithm.ScheduleAlgorithm expectErrorPod *v1.Pod + expectForgetPod *v1.Pod expectAssumedPod *v1.Pod expectError error expectBind *v1.Binding @@ -139,7 +140,8 @@ func TestScheduler(t *testing.T) { expectAssumedPod: podWithID("foo", testNode.Name), injectBindError: errB, expectError: errB, - expectErrorPod: podWithID("foo", ""), + expectErrorPod: podWithID("foo", testNode.Name), + expectForgetPod: podWithID("foo", testNode.Name), eventReason: "FailedScheduling", }, { sendPod: deletingPod("foo"), @@ -151,11 +153,15 @@ func TestScheduler(t *testing.T) { for i, item := range table { var gotError error var gotPod *v1.Pod + var gotForgetPod *v1.Pod var gotAssumedPod *v1.Pod var gotBinding *v1.Binding configurator := &FakeConfigurator{ Config: &Config{ SchedulerCache: &schedulertesting.FakeCache{ + ForgetFunc: func(pod *v1.Pod) { + gotForgetPod = pod + }, AssumeFunc: func(pod *v1.Pod) { gotAssumedPod = pod }, @@ -196,6 +202,9 @@ func TestScheduler(t *testing.T) { if e, a := item.expectErrorPod, gotPod; !reflect.DeepEqual(e, a) { t.Errorf("%v: error pod: wanted %v, got %v", i, e, a) } + if e, a := item.expectForgetPod, gotForgetPod; !reflect.DeepEqual(e, a) { + t.Errorf("%v: forget pod: wanted %v, got %v", i, e, a) + } if e, a := item.expectError, gotError; !reflect.DeepEqual(e, a) { t.Errorf("%v: error: wanted %v, got %v", i, e, a) } diff --git a/plugin/pkg/scheduler/testing/fake_cache.go b/plugin/pkg/scheduler/testing/fake_cache.go index de5719cf049..5b03e30241b 100644 --- a/plugin/pkg/scheduler/testing/fake_cache.go +++ b/plugin/pkg/scheduler/testing/fake_cache.go @@ -25,6 +25,7 @@ import ( // FakeCache is used for testing type FakeCache struct { AssumeFunc func(*v1.Pod) + ForgetFunc func(*v1.Pod) } func (f *FakeCache) AssumePod(pod *v1.Pod) error { @@ -34,7 +35,10 @@ func (f *FakeCache) AssumePod(pod *v1.Pod) error { func (f *FakeCache) FinishBinding(pod *v1.Pod) error { return nil } -func (f *FakeCache) ForgetPod(pod *v1.Pod) error { return nil } +func (f *FakeCache) ForgetPod(pod *v1.Pod) error { + f.ForgetFunc(pod) + return nil +} func (f *FakeCache) AddPod(pod *v1.Pod) error { return nil }