Skip to content

Commit b92d200

Browse files
authored
Merge pull request kubernetes#86205 from Huang-Wei/eps-pred-prefitler
Move EvenPodsSpread metadata computation logic as a PreFilter Plugin
2 parents efe159e + 3d353f5 commit b92d200

File tree

15 files changed

+410
-740
lines changed

15 files changed

+410
-740
lines changed

pkg/scheduler/algorithm/predicates/metadata.go

Lines changed: 17 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -105,11 +105,11 @@ func (paths *criticalPaths) update(tpVal string, num int32) {
105105
}
106106
}
107107

108-
// evenPodsSpreadMetadata combines tpKeyToCriticalPaths and tpPairToMatchNum
108+
// PodTopologySpreadMetadata combines tpKeyToCriticalPaths and tpPairToMatchNum
109109
// to represent:
110110
// (1) critical paths where the least pods are matched on each spread constraint.
111111
// (2) number of pods matched on each spread constraint.
112-
type evenPodsSpreadMetadata struct {
112+
type PodTopologySpreadMetadata struct {
113113
constraints []topologySpreadConstraint
114114
// We record 2 critical paths instead of all critical paths here.
115115
// criticalPaths[0].matchNum always holds the minimum matching number.
@@ -309,10 +309,6 @@ func (m *podFitsResourcesMetadata) clone() *podFitsResourcesMetadata {
309309
type predicateMetadata struct {
310310
pod *v1.Pod
311311

312-
// evenPodsSpreadMetadata holds info of the minimum match number on each topology spread constraint,
313-
// and the match number of all valid topology pairs.
314-
evenPodsSpreadMetadata *evenPodsSpreadMetadata
315-
316312
serviceAffinityMetadata *serviceAffinityMetadata
317313
podFitsResourcesMetadata *podFitsResourcesMetadata
318314
}
@@ -357,27 +353,8 @@ func (f *MetadataProducerFactory) GetPredicateMetadata(pod *v1.Pod, sharedLister
357353
return nil
358354
}
359355

360-
var allNodes []*schedulernodeinfo.NodeInfo
361-
if sharedLister != nil {
362-
var err error
363-
allNodes, err = sharedLister.NodeInfos().List()
364-
if err != nil {
365-
klog.Errorf("failed to list NodeInfos: %v", err)
366-
return nil
367-
}
368-
}
369-
370-
// evenPodsSpreadMetadata represents how existing pods match "pod"
371-
// on its spread constraints
372-
evenPodsSpreadMetadata, err := getEvenPodsSpreadMetadata(pod, allNodes)
373-
if err != nil {
374-
klog.Errorf("Error calculating spreadConstraintsMap: %v", err)
375-
return nil
376-
}
377-
378356
predicateMetadata := &predicateMetadata{
379357
pod: pod,
380-
evenPodsSpreadMetadata: evenPodsSpreadMetadata,
381358
podFitsResourcesMetadata: getPodFitsResourcesMetedata(pod),
382359
}
383360
for predicateName, precomputeFunc := range predicateMetadataProducers {
@@ -414,22 +391,23 @@ func GetPodAffinityMetadata(pod *v1.Pod, allNodes []*schedulernodeinfo.NodeInfo,
414391
}, nil
415392
}
416393

417-
func getEvenPodsSpreadMetadata(pod *v1.Pod, allNodes []*schedulernodeinfo.NodeInfo) (*evenPodsSpreadMetadata, error) {
394+
// GetPodTopologySpreadMetadata computes pod topology spread metadata.
395+
func GetPodTopologySpreadMetadata(pod *v1.Pod, allNodes []*schedulernodeinfo.NodeInfo) (*PodTopologySpreadMetadata, error) {
418396
// We have feature gating in APIServer to strip the spec
419397
// so don't need to re-check feature gate, just check length of constraints.
420398
constraints, err := filterHardTopologySpreadConstraints(pod.Spec.TopologySpreadConstraints)
421399
if err != nil {
422400
return nil, err
423401
}
424402
if len(constraints) == 0 {
425-
return nil, nil
403+
return &PodTopologySpreadMetadata{}, nil
426404
}
427405

428406
var lock sync.Mutex
429407

430408
// TODO(Huang-Wei): It might be possible to use "make(map[topologyPair]*int32)".
431409
// In that case, need to consider how to init each tpPairToCount[pair] in an atomic fashion.
432-
m := evenPodsSpreadMetadata{
410+
m := PodTopologySpreadMetadata{
433411
constraints: constraints,
434412
tpKeyToCriticalPaths: make(map[string]*criticalPaths, len(constraints)),
435413
tpPairToMatchNum: make(map[topologyPair]int32),
@@ -526,15 +504,17 @@ func (m topologyToMatchedTermCount) clone() topologyToMatchedTermCount {
526504
return copy
527505
}
528506

529-
func (m *evenPodsSpreadMetadata) addPod(addedPod, preemptorPod *v1.Pod, node *v1.Node) {
530-
m.updatePod(addedPod, preemptorPod, node, 1)
507+
// AddPod updates the metadata with addedPod.
508+
func (m *PodTopologySpreadMetadata) AddPod(addedPod, preemptorPod *v1.Pod, node *v1.Node) {
509+
m.updateWithPod(addedPod, preemptorPod, node, 1)
531510
}
532511

533-
func (m *evenPodsSpreadMetadata) removePod(deletedPod, preemptorPod *v1.Pod, node *v1.Node) {
534-
m.updatePod(deletedPod, preemptorPod, node, -1)
512+
// RemovePod updates the metadata with deletedPod.
513+
func (m *PodTopologySpreadMetadata) RemovePod(deletedPod, preemptorPod *v1.Pod, node *v1.Node) {
514+
m.updateWithPod(deletedPod, preemptorPod, node, -1)
535515
}
536516

537-
func (m *evenPodsSpreadMetadata) updatePod(updatedPod, preemptorPod *v1.Pod, node *v1.Node, delta int32) {
517+
func (m *PodTopologySpreadMetadata) updateWithPod(updatedPod, preemptorPod *v1.Pod, node *v1.Node, delta int32) {
538518
if m == nil || updatedPod.Namespace != preemptorPod.Namespace || node == nil {
539519
return
540520
}
@@ -556,12 +536,13 @@ func (m *evenPodsSpreadMetadata) updatePod(updatedPod, preemptorPod *v1.Pod, nod
556536
}
557537
}
558538

559-
func (m *evenPodsSpreadMetadata) clone() *evenPodsSpreadMetadata {
560-
// c could be nil when EvenPodsSpread feature is disabled
539+
// Clone makes a deep copy of PodTopologySpreadMetadata.
540+
func (m *PodTopologySpreadMetadata) Clone() *PodTopologySpreadMetadata {
541+
// m could be nil when EvenPodsSpread feature is disabled
561542
if m == nil {
562543
return nil
563544
}
564-
cp := evenPodsSpreadMetadata{
545+
cp := PodTopologySpreadMetadata{
565546
// constraints are shared because they don't change.
566547
constraints: m.constraints,
567548
tpKeyToCriticalPaths: make(map[string]*criticalPaths, len(m.tpKeyToCriticalPaths)),
@@ -584,7 +565,6 @@ func (meta *predicateMetadata) RemovePod(deletedPod *v1.Pod, node *v1.Node) erro
584565
if deletedPodFullName == schedutil.GetPodFullName(meta.pod) {
585566
return fmt.Errorf("deletedPod and meta.pod must not be the same")
586567
}
587-
meta.evenPodsSpreadMetadata.removePod(deletedPod, meta.pod, node)
588568
meta.serviceAffinityMetadata.removePod(deletedPod, node)
589569

590570
return nil
@@ -601,10 +581,6 @@ func (meta *predicateMetadata) AddPod(addedPod *v1.Pod, node *v1.Node) error {
601581
return fmt.Errorf("node not found")
602582
}
603583

604-
// Update meta.evenPodsSpreadMetadata if meta.pod has hard spread constraints
605-
// and addedPod matches that
606-
meta.evenPodsSpreadMetadata.addPod(addedPod, meta.pod, node)
607-
608584
meta.serviceAffinityMetadata.addPod(addedPod, meta.pod, node)
609585

610586
return nil
@@ -616,7 +592,6 @@ func (meta *predicateMetadata) ShallowCopy() Metadata {
616592
newPredMeta := &predicateMetadata{
617593
pod: meta.pod,
618594
}
619-
newPredMeta.evenPodsSpreadMetadata = meta.evenPodsSpreadMetadata.clone()
620595
newPredMeta.serviceAffinityMetadata = meta.serviceAffinityMetadata.clone()
621596
newPredMeta.podFitsResourcesMetadata = meta.podFitsResourcesMetadata.clone()
622597
return (Metadata)(newPredMeta)

0 commit comments

Comments
 (0)