From a48cc2644368d93769996c369b2adb726f2c86c7 Mon Sep 17 00:00:00 2001 From: kuramal Date: Tue, 17 Oct 2017 10:59:03 +0800 Subject: [PATCH] Optimize Repeated registration of AlgorithmProvider when ApplyFeatureGates Add InsertPredicateKeyToAlgorithmProviderMap() and RemovePredicateKeyFromAlgorithmProviderMap() to insert/remove fit predicate key of all algorithmProviders which in algorithmProviderMap Add Func RemovePredicateKeyFromAlgoProvider() AND InsertPredicateKeyToAlgoProvider() which can insert/remove fit predicate key to specific algorithmProvider --- .../algorithmprovider/defaults/defaults.go | 14 ++++-- plugin/pkg/scheduler/factory/plugins.go | 50 +++++++++++++++++++ 2 files changed, 59 insertions(+), 5 deletions(-) diff --git a/plugin/pkg/scheduler/algorithmprovider/defaults/defaults.go b/plugin/pkg/scheduler/algorithmprovider/defaults/defaults.go index 0de465248b3..77e60f5263c 100644 --- a/plugin/pkg/scheduler/algorithmprovider/defaults/defaults.go +++ b/plugin/pkg/scheduler/algorithmprovider/defaults/defaults.go @@ -195,20 +195,24 @@ func defaultPredicates() sets.String { // ApplyFeatureGates applies algorithm by feature gates. func ApplyFeatureGates() { - predSet := defaultPredicates() if utilfeature.DefaultFeatureGate.Enabled(features.TaintNodesByCondition) { // Remove "CheckNodeCondition" predicate factory.RemoveFitPredicate("CheckNodeCondition") - predSet.Delete("CheckNodeCondition") + // Remove Key "CheckNodeCondition" From All Algorithm Provider + // The key will be removed from all providers which in algorithmProviderMap[] + // if you just want remove specific provider, call func RemovePredicateKeyFromAlgoProvider() + factory.RemovePredicateKeyFromAlgorithmProviderMap("CheckNodeCondition") // Fit is determined based on whether a pod can tolerate all of the node's taints - predSet.Insert(factory.RegisterMandatoryFitPredicate("PodToleratesNodeTaints", predicates.PodToleratesNodeTaints)) + factory.RegisterMandatoryFitPredicate("PodToleratesNodeTaints", predicates.PodToleratesNodeTaints) + // Insert Key "PodToleratesNodeTaints" To All Algorithm Provider + // The key will insert to all providers which in algorithmProviderMap[] + // if you just want insert to specific provider, call func InsertPredicateKeyToAlgoProvider() + factory.InsertPredicateKeyToAlgorithmProviderMap("PodToleratesNodeTaints") glog.Warningf("TaintNodesByCondition is enabled, PodToleratesNodeTaints predicate is mandatory") } - - registerAlgorithmProvider(predSet, defaultPriorities()) } func registerAlgorithmProvider(predSet, priSet sets.String) { diff --git a/plugin/pkg/scheduler/factory/plugins.go b/plugin/pkg/scheduler/factory/plugins.go index 74840d013b5..9f5398c54b4 100644 --- a/plugin/pkg/scheduler/factory/plugins.go +++ b/plugin/pkg/scheduler/factory/plugins.go @@ -115,6 +115,56 @@ func RemoveFitPredicate(name string) { mandatoryFitPredicates.Delete(name) } +// RemovePredicateKeyFromAlgoProvider removes a fit predicate key from algorithmProvider. +func RemovePredicateKeyFromAlgoProvider(providerName, key string) error { + schedulerFactoryMutex.Lock() + defer schedulerFactoryMutex.Unlock() + + validateAlgorithmNameOrDie(providerName) + provider, ok := algorithmProviderMap[providerName] + if !ok { + return fmt.Errorf("plugin %v has not been registered", providerName) + } + provider.FitPredicateKeys.Delete(key) + return nil +} + +// RemovePredicateKeyFromAlgoProvider removes a fit predicate key from all algorithmProviders which in algorithmProviderMap. +func RemovePredicateKeyFromAlgorithmProviderMap(key string) { + schedulerFactoryMutex.Lock() + defer schedulerFactoryMutex.Unlock() + + for _, provider := range algorithmProviderMap { + provider.FitPredicateKeys.Delete(key) + } + return +} + +// InsertPredicateKeyToAlgoProvider insert a fit predicate key to algorithmProvider. +func InsertPredicateKeyToAlgoProvider(providerName, key string) error { + schedulerFactoryMutex.Lock() + defer schedulerFactoryMutex.Unlock() + + validateAlgorithmNameOrDie(providerName) + provider, ok := algorithmProviderMap[providerName] + if !ok { + return fmt.Errorf("plugin %v has not been registered", providerName) + } + provider.FitPredicateKeys.Insert(key) + return nil +} + +// InsertPredicateKeyToAlgorithmProviderMap insert a fit predicate key to all algorithmProviders which in algorithmProviderMap. +func InsertPredicateKeyToAlgorithmProviderMap(key string) { + schedulerFactoryMutex.Lock() + defer schedulerFactoryMutex.Unlock() + + for _, provider := range algorithmProviderMap { + provider.FitPredicateKeys.Insert(key) + } + return +} + // RegisterMandatoryFitPredicate registers a fit predicate with the algorithm registry, the predicate is used by // kubelet, DaemonSet; it is always included in configuration. Returns the name with which the predicate was // registered.