scheduler: code clean up for predicates/metadata

This commit is contained in:
SataQiu 2019-09-29 10:11:53 +08:00
parent d92a250636
commit bcaa991676
3 changed files with 16 additions and 15 deletions

View File

@ -37,7 +37,7 @@ import (
// PredicateMetadata interface represents anything that can access a predicate metadata. // PredicateMetadata interface represents anything that can access a predicate metadata.
type PredicateMetadata interface { type PredicateMetadata interface {
ShallowCopy() PredicateMetadata ShallowCopy() PredicateMetadata
AddPod(addedPod *v1.Pod, nodeInfo *schedulernodeinfo.NodeInfo) error AddPod(addedPod *v1.Pod, node *v1.Node) error
RemovePod(deletedPod *v1.Pod, node *v1.Node) error RemovePod(deletedPod *v1.Pod, node *v1.Node) error
} }
@ -350,8 +350,10 @@ func NodeLabelsMatchSpreadConstraints(nodeLabels map[string]string, constraints
// returns a pointer to a new topologyPairsMaps // returns a pointer to a new topologyPairsMaps
func newTopologyPairsMaps() *topologyPairsMaps { func newTopologyPairsMaps() *topologyPairsMaps {
return &topologyPairsMaps{topologyPairToPods: make(map[topologyPair]podSet), return &topologyPairsMaps{
podToTopologyPairs: make(map[string]topologyPairSet)} topologyPairToPods: make(map[topologyPair]podSet),
podToTopologyPairs: make(map[string]topologyPairSet),
}
} }
func (m *topologyPairsMaps) addTopologyPair(pair topologyPair, pod *v1.Pod) { func (m *topologyPairsMaps) addTopologyPair(pair topologyPair, pod *v1.Pod) {
@ -478,18 +480,18 @@ func (meta *predicateMetadata) RemovePod(deletedPod *v1.Pod, node *v1.Node) erro
return nil return nil
} }
// AddPod changes predicateMetadata assuming that `newPod` is added to the // AddPod changes predicateMetadata assuming that the given `addedPod` is added to the
// system. // system.
func (meta *predicateMetadata) AddPod(addedPod *v1.Pod, nodeInfo *schedulernodeinfo.NodeInfo) error { func (meta *predicateMetadata) AddPod(addedPod *v1.Pod, node *v1.Node) error {
addedPodFullName := schedutil.GetPodFullName(addedPod) addedPodFullName := schedutil.GetPodFullName(addedPod)
if addedPodFullName == schedutil.GetPodFullName(meta.pod) { if addedPodFullName == schedutil.GetPodFullName(meta.pod) {
return fmt.Errorf("addedPod and meta.pod must not be the same") return fmt.Errorf("addedPod and meta.pod must not be the same")
} }
if nodeInfo.Node() == nil { if node == nil {
return fmt.Errorf("invalid node in nodeInfo") return fmt.Errorf("node not found")
} }
// Add matching anti-affinity terms of the addedPod to the map. // Add matching anti-affinity terms of the addedPod to the map.
topologyPairsMaps, err := getMatchingAntiAffinityTopologyPairsOfPod(meta.pod, addedPod, nodeInfo.Node()) topologyPairsMaps, err := getMatchingAntiAffinityTopologyPairsOfPod(meta.pod, addedPod, node)
if err != nil { if err != nil {
return err return err
} }
@ -498,14 +500,13 @@ func (meta *predicateMetadata) AddPod(addedPod *v1.Pod, nodeInfo *schedulernodei
affinity := meta.pod.Spec.Affinity affinity := meta.pod.Spec.Affinity
podNodeName := addedPod.Spec.NodeName podNodeName := addedPod.Spec.NodeName
if affinity != nil && len(podNodeName) > 0 { if affinity != nil && len(podNodeName) > 0 {
podNode := nodeInfo.Node()
// It is assumed that when the added pod matches affinity of the meta.pod, all the terms must match, // It is assumed that when the added pod matches affinity of the meta.pod, all the terms must match,
// this should be changed when the implementation of targetPodMatchesAffinityOfPod/podMatchesAffinityTermProperties // this should be changed when the implementation of targetPodMatchesAffinityOfPod/podMatchesAffinityTermProperties
// is changed // is changed
if targetPodMatchesAffinityOfPod(meta.pod, addedPod) { if targetPodMatchesAffinityOfPod(meta.pod, addedPod) {
affinityTerms := GetPodAffinityTerms(affinity.PodAffinity) affinityTerms := GetPodAffinityTerms(affinity.PodAffinity)
for _, term := range affinityTerms { for _, term := range affinityTerms {
if topologyValue, ok := podNode.Labels[term.TopologyKey]; ok { if topologyValue, ok := node.Labels[term.TopologyKey]; ok {
pair := topologyPair{key: term.TopologyKey, value: topologyValue} pair := topologyPair{key: term.TopologyKey, value: topologyValue}
meta.topologyPairsPotentialAffinityPods.addTopologyPair(pair, addedPod) meta.topologyPairsPotentialAffinityPods.addTopologyPair(pair, addedPod)
} }
@ -514,7 +515,7 @@ func (meta *predicateMetadata) AddPod(addedPod *v1.Pod, nodeInfo *schedulernodei
if targetPodMatchesAntiAffinityOfPod(meta.pod, addedPod) { if targetPodMatchesAntiAffinityOfPod(meta.pod, addedPod) {
antiAffinityTerms := GetPodAntiAffinityTerms(affinity.PodAntiAffinity) antiAffinityTerms := GetPodAntiAffinityTerms(affinity.PodAntiAffinity)
for _, term := range antiAffinityTerms { for _, term := range antiAffinityTerms {
if topologyValue, ok := podNode.Labels[term.TopologyKey]; ok { if topologyValue, ok := node.Labels[term.TopologyKey]; ok {
pair := topologyPair{key: term.TopologyKey, value: topologyValue} pair := topologyPair{key: term.TopologyKey, value: topologyValue}
meta.topologyPairsPotentialAntiAffinityPods.addTopologyPair(pair, addedPod) meta.topologyPairsPotentialAntiAffinityPods.addTopologyPair(pair, addedPod)
} }
@ -523,7 +524,7 @@ func (meta *predicateMetadata) AddPod(addedPod *v1.Pod, nodeInfo *schedulernodei
} }
// Update meta.podSpreadCache if meta.pod has hard spread constraints // Update meta.podSpreadCache if meta.pod has hard spread constraints
// and addedPod matches that // and addedPod matches that
if err := meta.podSpreadCache.addPod(addedPod, meta.pod, nodeInfo.Node()); err != nil { if err := meta.podSpreadCache.addPod(addedPod, meta.pod, node); err != nil {
return err return err
} }

View File

@ -375,7 +375,7 @@ func TestPredicateMetadata_AddRemovePod(t *testing.T) {
existingPodsMeta1, nodeInfoMap := getMeta(st.FakePodLister(test.existingPods)) existingPodsMeta1, nodeInfoMap := getMeta(st.FakePodLister(test.existingPods))
// Add test.addedPod to existingPodsMeta1 and make sure meta is equal to allPodsMeta // Add test.addedPod to existingPodsMeta1 and make sure meta is equal to allPodsMeta
nodeInfo := nodeInfoMap[test.addedPod.Spec.NodeName] nodeInfo := nodeInfoMap[test.addedPod.Spec.NodeName]
if err := existingPodsMeta1.AddPod(test.addedPod, nodeInfo); err != nil { if err := existingPodsMeta1.AddPod(test.addedPod, nodeInfo.Node()); err != nil {
t.Errorf("error adding pod to meta: %v", err) t.Errorf("error adding pod to meta: %v", err)
} }
if err := predicateMetadataEquivalent(allPodsMeta, existingPodsMeta1); err != nil { if err := predicateMetadataEquivalent(allPodsMeta, existingPodsMeta1); err != nil {

View File

@ -597,7 +597,7 @@ func addNominatedPods(pod *v1.Pod, meta predicates.PredicateMetadata,
if podutil.GetPodPriority(p) >= podutil.GetPodPriority(pod) && p.UID != pod.UID { if podutil.GetPodPriority(p) >= podutil.GetPodPriority(pod) && p.UID != pod.UID {
nodeInfoOut.AddPod(p) nodeInfoOut.AddPod(p)
if metaOut != nil { if metaOut != nil {
if err := metaOut.AddPod(p, nodeInfoOut); err != nil { if err := metaOut.AddPod(p, nodeInfoOut.Node()); err != nil {
klog.Warningf("unable to add pod, nominated pod %s, incoming pod %s: %v", p.Name, pod.Name, err) klog.Warningf("unable to add pod, nominated pod %s, incoming pod %s: %v", p.Name, pod.Name, err)
} }
} }
@ -1128,7 +1128,7 @@ func (g *genericScheduler) selectVictimsOnNode(
addPod := func(ap *v1.Pod) error { addPod := func(ap *v1.Pod) error {
nodeInfoCopy.AddPod(ap) nodeInfoCopy.AddPod(ap)
if meta != nil { if meta != nil {
if err := meta.AddPod(ap, nodeInfoCopy); err != nil { if err := meta.AddPod(ap, nodeInfoCopy.Node()); err != nil {
return err return err
} }
} }