From 6116c64f64271046425874d569da1e754b22eca0 Mon Sep 17 00:00:00 2001 From: AdoHe Date: Wed, 6 Jun 2018 21:13:12 +0800 Subject: [PATCH] keep pod state consistent when UpdatePod --- pkg/scheduler/cache/cache.go | 1 + pkg/scheduler/cache/cache_test.go | 59 +++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) diff --git a/pkg/scheduler/cache/cache.go b/pkg/scheduler/cache/cache.go index 38e26f51bfd..be4a808c1f9 100644 --- a/pkg/scheduler/cache/cache.go +++ b/pkg/scheduler/cache/cache.go @@ -317,6 +317,7 @@ func (cache *schedulerCache) UpdatePod(oldPod, newPod *v1.Pod) error { if err := cache.updatePod(oldPod, newPod); err != nil { return err } + currState.pod = newPod default: return fmt.Errorf("pod %v is not added to scheduler cache, so cannot be updated", key) } diff --git a/pkg/scheduler/cache/cache_test.go b/pkg/scheduler/cache/cache_test.go index 59721137788..658acf91064 100644 --- a/pkg/scheduler/cache/cache_test.go +++ b/pkg/scheduler/cache/cache_test.go @@ -577,6 +577,65 @@ func TestUpdatePod(t *testing.T) { } } +// TestUpdatePodAndGet tests get always return latest pod state +func TestUpdatePodAndGet(t *testing.T) { + nodeName := "node" + ttl := 10 * time.Second + testPods := []*v1.Pod{ + makeBasePod(t, nodeName, "test", "100m", "500", "", []v1.ContainerPort{{HostIP: "127.0.0.1", HostPort: 80, Protocol: "TCP"}}), + makeBasePod(t, nodeName, "test", "200m", "1Ki", "", []v1.ContainerPort{{HostIP: "127.0.0.1", HostPort: 8080, Protocol: "TCP"}}), + } + tests := []struct { + pod *v1.Pod + + podToUpdate *v1.Pod + handler func(cache Cache, pod *v1.Pod) error + + assumePod bool + }{ + { + pod: testPods[0], + + podToUpdate: testPods[0], + handler: func(cache Cache, pod *v1.Pod) error { + return cache.AssumePod(pod) + }, + assumePod: true, + }, + { + pod: testPods[0], + + podToUpdate: testPods[1], + handler: func(cache Cache, pod *v1.Pod) error { + return cache.AddPod(pod) + }, + assumePod: false, + }, + } + + for _, tt := range tests { + cache := newSchedulerCache(ttl, time.Second, nil) + + if err := tt.handler(cache, tt.pod); err != nil { + t.Fatalf("unexpected err: %v", err) + } + + if !tt.assumePod { + if err := cache.UpdatePod(tt.pod, tt.podToUpdate); err != nil { + t.Fatalf("UpdatePod failed: %v", err) + } + } + + cachedPod, err := cache.GetPod(tt.pod) + if err != nil { + t.Fatalf("GetPod failed: %v", err) + } + if !reflect.DeepEqual(tt.podToUpdate, cachedPod) { + t.Fatalf("pod get=%s, want=%s", cachedPod, tt.podToUpdate) + } + } +} + // TestExpireAddUpdatePod test the sequence that a pod is expired, added, then updated func TestExpireAddUpdatePod(t *testing.T) { // Enable volumesOnNodeForBalancing to do balanced resource allocation