From b92eadfd1aa990d2df921e252a027c57f309b4d8 Mon Sep 17 00:00:00 2001 From: Wojciech Tyczynski Date: Fri, 8 Jul 2016 08:25:49 +0200 Subject: [PATCH] Avoid computing QOS multiple times --- .../algorithm/predicates/predicates.go | 21 +++++++++++++++++-- plugin/pkg/scheduler/factory/factory_test.go | 4 ++-- plugin/pkg/scheduler/generic_scheduler.go | 7 ++++--- 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/plugin/pkg/scheduler/algorithm/predicates/predicates.go b/plugin/pkg/scheduler/algorithm/predicates/predicates.go index 03eb6afc265..8e476c8d7b1 100644 --- a/plugin/pkg/scheduler/algorithm/predicates/predicates.go +++ b/plugin/pkg/scheduler/algorithm/predicates/predicates.go @@ -68,10 +68,17 @@ func (c *CachedNodeInfo) GetNodeInfo(id string) (*api.Node, error) { // podMetadata defines a type, that is an expected type that is passed // as metadata for predicate functions type predicateMetadata struct { + podBestEffort bool } func PredicateMetadata(pod *api.Pod) interface{} { - return &predicateMetadata{} + if pod == nil { + // We cannot compute metadata, just return nil + return nil + } + return &predicateMetadata{ + podBestEffort: isPodBestEffort(pod), + } } func isVolumeConflict(volume api.Volume, pod *api.Pod) bool { @@ -1060,8 +1067,18 @@ func CheckNodeMemoryPressurePredicate(pod *api.Pod, meta interface{}, nodeInfo * return false, fmt.Errorf("node not found") } + var podBestEffort bool + + predicateMeta, ok := meta.(*predicateMetadata) + if ok { + podBestEffort = predicateMeta.podBestEffort + } else { + // We couldn't parse metadata - fallback to computing it. + podBestEffort = isPodBestEffort(pod) + } + // pod is not BestEffort pod - if !isPodBestEffort(pod) { + if !podBestEffort { return true, nil } diff --git a/plugin/pkg/scheduler/factory/factory_test.go b/plugin/pkg/scheduler/factory/factory_test.go index 689a5befc81..24d0823d0d2 100644 --- a/plugin/pkg/scheduler/factory/factory_test.go +++ b/plugin/pkg/scheduler/factory/factory_test.go @@ -116,11 +116,11 @@ func TestCreateFromEmptyConfig(t *testing.T) { factory.CreateFromConfig(policy) } -func PredicateOne(pod *api.Pod, nodeInfo *schedulercache.NodeInfo) (bool, error) { +func PredicateOne(pod *api.Pod, meta interface{}, nodeInfo *schedulercache.NodeInfo) (bool, error) { return true, nil } -func PredicateTwo(pod *api.Pod, nodeInfo *schedulercache.NodeInfo) (bool, error) { +func PredicateTwo(pod *api.Pod, meta interface{}, nodeInfo *schedulercache.NodeInfo) (bool, error) { return true, nil } diff --git a/plugin/pkg/scheduler/generic_scheduler.go b/plugin/pkg/scheduler/generic_scheduler.go index d084f76850c..a7365469133 100644 --- a/plugin/pkg/scheduler/generic_scheduler.go +++ b/plugin/pkg/scheduler/generic_scheduler.go @@ -144,9 +144,10 @@ func findNodesThatFit(pod *api.Pod, nodeNameToInfo map[string]*schedulercache.No } else { predicateResultLock := sync.Mutex{} errs := []error{} + meta := predicates.PredicateMetadata(pod) checkNode := func(i int) { nodeName := nodes.Items[i].Name - fits, failedPredicate, err := podFitsOnNode(pod, nodeNameToInfo[nodeName], predicateFuncs) + fits, failedPredicate, err := podFitsOnNode(pod, meta, nodeNameToInfo[nodeName], predicateFuncs) predicateResultLock.Lock() defer predicateResultLock.Unlock() @@ -182,9 +183,9 @@ func findNodesThatFit(pod *api.Pod, nodeNameToInfo map[string]*schedulercache.No } // Checks whether node with a given name and NodeInfo satisfies all predicateFuncs. -func podFitsOnNode(pod *api.Pod, info *schedulercache.NodeInfo, predicateFuncs map[string]algorithm.FitPredicate) (bool, string, error) { +func podFitsOnNode(pod *api.Pod, meta interface{}, info *schedulercache.NodeInfo, predicateFuncs map[string]algorithm.FitPredicate) (bool, string, error) { for _, predicate := range predicateFuncs { - fit, err := predicate(pod, nil, info) + fit, err := predicate(pod, meta, info) if err != nil { switch e := err.(type) { case *predicates.InsufficientResourceError: