From ca7bfc02ee085467e97b123dc924c016daa2b690 Mon Sep 17 00:00:00 2001 From: Jonathan Basseri Date: Mon, 23 Apr 2018 15:19:12 -0700 Subject: [PATCH] Add IsUpTodate() to Cache interface. This allows scheduler implementations to check if a NodeInfo object matches the current state of the cache. Useful if the NodeInfo in question came from a Snapshot() for example. --- pkg/scheduler/schedulercache/BUILD | 1 + pkg/scheduler/schedulercache/cache.go | 7 +++++++ pkg/scheduler/schedulercache/cache_test.go | 24 ++++++++++++++++++++++ pkg/scheduler/schedulercache/interface.go | 3 +++ pkg/scheduler/testing/fake_cache.go | 3 +++ 5 files changed, 38 insertions(+) diff --git a/pkg/scheduler/schedulercache/BUILD b/pkg/scheduler/schedulercache/BUILD index 7178d4ddc6d..28ca09987f4 100644 --- a/pkg/scheduler/schedulercache/BUILD +++ b/pkg/scheduler/schedulercache/BUILD @@ -43,6 +43,7 @@ go_test( "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", ], ) diff --git a/pkg/scheduler/schedulercache/cache.go b/pkg/scheduler/schedulercache/cache.go index fd013a5b19b..483558ed1d8 100644 --- a/pkg/scheduler/schedulercache/cache.go +++ b/pkg/scheduler/schedulercache/cache.go @@ -460,6 +460,13 @@ func (cache *schedulerCache) ListPDBs(selector labels.Selector) ([]*policy.PodDi return pdbs, nil } +func (cache *schedulerCache) IsUpToDate(n *NodeInfo) bool { + cache.mu.Lock() + defer cache.mu.Unlock() + node, ok := cache.nodes[n.Node().Name] + return ok && n.generation == node.generation +} + func (cache *schedulerCache) run() { go wait.Until(cache.cleanupExpiredAssumedPods, cache.period, cache.stop) } diff --git a/pkg/scheduler/schedulercache/cache_test.go b/pkg/scheduler/schedulercache/cache_test.go index 99b9bea958a..69cd53a8b64 100644 --- a/pkg/scheduler/schedulercache/cache_test.go +++ b/pkg/scheduler/schedulercache/cache_test.go @@ -30,6 +30,7 @@ import ( "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/intstr" + "k8s.io/apimachinery/pkg/util/wait" utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/kubernetes/pkg/features" priorityutil "k8s.io/kubernetes/pkg/scheduler/algorithm/priorities/util" @@ -1241,3 +1242,26 @@ func TestPDBOperations(t *testing.T) { } } } + +func TestIsUpToDate(t *testing.T) { + cache := New(time.Duration(0), wait.NeverStop) + if err := cache.AddNode(&v1.Node{ObjectMeta: metav1.ObjectMeta{Name: "n1"}}); err != nil { + t.Errorf("Could not add node: %v", err) + } + s := cache.Snapshot() + node := s.Nodes["n1"] + if !cache.IsUpToDate(node) { + t.Errorf("Node incorrectly marked as stale") + } + pod := &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "p1", UID: "p1"}, Spec: v1.PodSpec{NodeName: "n1"}} + if err := cache.AddPod(pod); err != nil { + t.Errorf("Could not add pod: %v", err) + } + if cache.IsUpToDate(node) { + t.Errorf("Node incorrectly marked as up to date") + } + badNode := &NodeInfo{node: &v1.Node{ObjectMeta: metav1.ObjectMeta{Name: "n2"}}} + if cache.IsUpToDate(badNode) { + t.Errorf("Nonexistant node incorrectly marked as up to date") + } +} diff --git a/pkg/scheduler/schedulercache/interface.go b/pkg/scheduler/schedulercache/interface.go index 8e4f4909c75..475d40fe6ad 100644 --- a/pkg/scheduler/schedulercache/interface.go +++ b/pkg/scheduler/schedulercache/interface.go @@ -122,6 +122,9 @@ type Cache interface { // Snapshot takes a snapshot on current cache Snapshot() *Snapshot + + // IsUpToDate returns true if the given NodeInfo matches the current data in the cache. + IsUpToDate(n *NodeInfo) bool } // Snapshot is a snapshot of cache state diff --git a/pkg/scheduler/testing/fake_cache.go b/pkg/scheduler/testing/fake_cache.go index e958a14b2f7..9a78493eed8 100644 --- a/pkg/scheduler/testing/fake_cache.go +++ b/pkg/scheduler/testing/fake_cache.go @@ -105,3 +105,6 @@ func (f *FakeCache) FilteredList(filter schedulercache.PodFilter, selector label func (f *FakeCache) Snapshot() *schedulercache.Snapshot { return &schedulercache.Snapshot{} } + +// IsUpToDate is a fake mthod for testing +func (f *FakeCache) IsUpToDate(*schedulercache.NodeInfo) bool { return true }