Merge pull request #28886 from wojtek-t/fix_schedulercache_bug

Automatic merge from submit-queue

Add ForgetPod to SchedulerCache

Fix #28883

@gmarek @davidopp @xiang90
This commit is contained in:
k8s-merge-robot 2016-07-14 05:30:23 -07:00 committed by GitHub
commit 6bb0995c89
6 changed files with 51 additions and 10 deletions

View File

@ -140,6 +140,9 @@ func (s *Scheduler) scheduleOne() {
err := s.config.Binder.Bind(b)
if err != nil {
glog.V(1).Infof("Failed to bind pod: %v/%v", pod.Namespace, pod.Name)
if err := s.config.SchedulerCache.ForgetPod(&assumed); err != nil {
glog.Errorf("scheduler cache ForgetPod failed: %v", err)
}
s.config.Error(pod, err)
s.config.Recorder.Eventf(pod, api.EventTypeNormal, "FailedScheduling", "Binding rejected: %v", err)
s.config.PodConditionUpdater.Update(pod, &api.PodCondition{

View File

@ -132,6 +132,30 @@ func (cache *schedulerCache) assumePod(pod *api.Pod, now time.Time) error {
return nil
}
func (cache *schedulerCache) ForgetPod(pod *api.Pod) error {
key, err := getPodKey(pod)
if err != nil {
return err
}
cache.mu.Lock()
defer cache.mu.Unlock()
_, ok := cache.podStates[key]
switch {
// Only assumed pod can be forgotten.
case ok && cache.assumedPods[key]:
err := cache.removePod(pod)
if err != nil {
return err
}
delete(cache.podStates, key)
default:
return fmt.Errorf("pod state wasn't assumed but get forgotten. Pod key: %v", key)
}
return nil
}
func (cache *schedulerCache) AddPod(pod *api.Pod) error {
key, err := getPodKey(pod)
if err != nil {

View File

@ -106,6 +106,15 @@ func TestAssumePodScheduled(t *testing.T) {
}
n := cache.nodes[nodeName]
deepEqualWithoutGeneration(t, i, n, tt.wNodeInfo)
for _, pod := range tt.pods {
if err := cache.ForgetPod(pod); err != nil {
t.Fatalf("ForgetPod failed: %v", err)
}
}
if cache.nodes[nodeName] != nil {
t.Errorf("NodeInfo should be cleaned for %s", nodeName)
}
}
}

View File

@ -36,13 +36,13 @@ import (
// | | | | Update
// + Assume Add v v |
//Initial +--------> Assumed +------------+---> Added <--+
// + | +
// | | |
// | Add | | Remove
// | | |
// | + |
// +-------------> Expired +----> Deleted
// Expire
// ^ + + | +
// | | | | |
// | | | Add | | Remove
// | | | | |
// | | | + |
// +----------------+ +-----------> Expired +----> Deleted
// Forget Expire
//
//
// Note that an assumed pod can expire, because if we haven't received Add event notifying us
@ -61,6 +61,9 @@ type Cache interface {
// After expiration, its information would be subtracted.
AssumePod(pod *api.Pod) error
// ForgetPod removes an assumed pod from cache.
ForgetPod(pod *api.Pod) error
// AddPod either confirms a pod if it's assumed, or adds it back if it's expired.
// If added back, the pod's information would be added again.
AddPod(pod *api.Pod) error

View File

@ -32,6 +32,8 @@ func (f *FakeCache) AssumePod(pod *api.Pod) error {
return nil
}
func (f *FakeCache) ForgetPod(pod *api.Pod) error { return nil }
func (f *FakeCache) AddPod(pod *api.Pod) error { return nil }
func (f *FakeCache) UpdatePod(oldPod, newPod *api.Pod) error { return nil }

View File

@ -25,9 +25,9 @@ import (
// PodsToCache is used for testing
type PodsToCache []*api.Pod
func (p PodsToCache) AssumePod(pod *api.Pod) error {
return nil
}
func (p PodsToCache) AssumePod(pod *api.Pod) error { return nil }
func (p PodsToCache) ForgetPod(pod *api.Pod) error { return nil }
func (p PodsToCache) AddPod(pod *api.Pod) error { return nil }