From a86ba8b3c44b924ee1b02253f6d30f104574afc4 Mon Sep 17 00:00:00 2001 From: Wei Huang Date: Fri, 16 Nov 2018 12:07:28 -0800 Subject: [PATCH] fix a scheduler panic due to internal cache inconsistency --- pkg/scheduler/core/generic_scheduler.go | 4 +++- pkg/scheduler/core/generic_scheduler_test.go | 5 +++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/pkg/scheduler/core/generic_scheduler.go b/pkg/scheduler/core/generic_scheduler.go index 40effb6fd3..be46ac3aad 100644 --- a/pkg/scheduler/core/generic_scheduler.go +++ b/pkg/scheduler/core/generic_scheduler.go @@ -895,7 +895,6 @@ func selectNodesForPreemption(pod *v1.Pod, queue internalqueue.SchedulingQueue, pdbs []*policy.PodDisruptionBudget, ) (map[*v1.Node]*schedulerapi.Victims, error) { - nodeToVictims := map[*v1.Node]*schedulerapi.Victims{} var resultLock sync.Mutex @@ -984,6 +983,9 @@ func selectVictimsOnNode( queue internalqueue.SchedulingQueue, pdbs []*policy.PodDisruptionBudget, ) ([]*v1.Pod, int, bool) { + if nodeInfo == nil { + return nil, 0, false + } potentialVictims := util.SortableList{CompFunc: util.HigherPriorityPod} nodeInfoCopy := nodeInfo.Clone() diff --git a/pkg/scheduler/core/generic_scheduler_test.go b/pkg/scheduler/core/generic_scheduler_test.go index cfc1ea86f2..d0152a9fbb 100644 --- a/pkg/scheduler/core/generic_scheduler_test.go +++ b/pkg/scheduler/core/generic_scheduler_test.go @@ -960,6 +960,11 @@ func TestSelectNodesForPreemption(t *testing.T) { test.predicates[algorithmpredicates.MatchInterPodAffinityPred] = algorithmpredicates.NewPodAffinityPredicate(FakeNodeInfo(*nodes[0]), schedulertesting.FakePodLister(test.pods)) } nodeNameToInfo := schedulercache.CreateNodeNameToInfoMap(test.pods, nodes) + // newnode simulate a case that a new node is added to the cluster, but nodeNameToInfo + // doesn't have it yet. + newnode := makeNode("newnode", 1000*5, priorityutil.DefaultMemoryRequest*5) + newnode.ObjectMeta.Labels = map[string]string{"hostname": "newnode"} + nodes = append(nodes, newnode) nodeToPods, err := selectNodesForPreemption(test.pod, nodeNameToInfo, nodes, test.predicates, PredicateMetadata, nil, nil) if err != nil { t.Error(err)