Avoid computing QOS multiple times

This commit is contained in:
Wojciech Tyczynski 2016-07-08 08:25:49 +02:00
parent 6890868823
commit b92eadfd1a
3 changed files with 25 additions and 7 deletions

View File

@ -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 // podMetadata defines a type, that is an expected type that is passed
// as metadata for predicate functions // as metadata for predicate functions
type predicateMetadata struct { type predicateMetadata struct {
podBestEffort bool
} }
func PredicateMetadata(pod *api.Pod) interface{} { 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 { 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") 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 // pod is not BestEffort pod
if !isPodBestEffort(pod) { if !podBestEffort {
return true, nil return true, nil
} }

View File

@ -116,11 +116,11 @@ func TestCreateFromEmptyConfig(t *testing.T) {
factory.CreateFromConfig(policy) 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 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 return true, nil
} }

View File

@ -144,9 +144,10 @@ func findNodesThatFit(pod *api.Pod, nodeNameToInfo map[string]*schedulercache.No
} else { } else {
predicateResultLock := sync.Mutex{} predicateResultLock := sync.Mutex{}
errs := []error{} errs := []error{}
meta := predicates.PredicateMetadata(pod)
checkNode := func(i int) { checkNode := func(i int) {
nodeName := nodes.Items[i].Name nodeName := nodes.Items[i].Name
fits, failedPredicate, err := podFitsOnNode(pod, nodeNameToInfo[nodeName], predicateFuncs) fits, failedPredicate, err := podFitsOnNode(pod, meta, nodeNameToInfo[nodeName], predicateFuncs)
predicateResultLock.Lock() predicateResultLock.Lock()
defer predicateResultLock.Unlock() 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. // 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 { for _, predicate := range predicateFuncs {
fit, err := predicate(pod, nil, info) fit, err := predicate(pod, meta, info)
if err != nil { if err != nil {
switch e := err.(type) { switch e := err.(type) {
case *predicates.InsufficientResourceError: case *predicates.InsufficientResourceError: