Skip to content

Commit c33f217

Browse files
committed
tracking nodes with pod with affinity
1 parent 75aca1f commit c33f217

File tree

7 files changed

+48
-9
lines changed

7 files changed

+48
-9
lines changed

pkg/scheduler/algorithm/predicates/metadata.go

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -338,13 +338,20 @@ func GetPredicateMetadata(pod *v1.Pod, sharedLister schedulerlisters.SharedListe
338338
}
339339

340340
var allNodes []*schedulernodeinfo.NodeInfo
341+
var havePodsWithAffinityNodes []*schedulernodeinfo.NodeInfo
341342
if sharedLister != nil {
342-
n, err := sharedLister.NodeInfos().List()
343+
var err error
344+
allNodes, err = sharedLister.NodeInfos().List()
343345
if err != nil {
344346
klog.Errorf("failed to list NodeInfos: %v", err)
345347
return nil
346348
}
347-
allNodes = n
349+
havePodsWithAffinityNodes, err = sharedLister.NodeInfos().HavePodsWithAffinityList()
350+
if err != nil {
351+
klog.Errorf("failed to list NodeInfos: %v", err)
352+
return nil
353+
}
354+
348355
}
349356

350357
// evenPodsSpreadMetadata represents how existing pods match "pod"
@@ -355,7 +362,7 @@ func GetPredicateMetadata(pod *v1.Pod, sharedLister schedulerlisters.SharedListe
355362
return nil
356363
}
357364

358-
podAffinityMetadata, err := getPodAffinityMetadata(pod, allNodes)
365+
podAffinityMetadata, err := getPodAffinityMetadata(pod, allNodes, havePodsWithAffinityNodes)
359366
if err != nil {
360367
klog.Errorf("Error calculating podAffinityMetadata: %v", err)
361368
return nil
@@ -387,9 +394,9 @@ func getPodFitsResourcesMetedata(pod *v1.Pod) *podFitsResourcesMetadata {
387394
}
388395
}
389396

390-
func getPodAffinityMetadata(pod *v1.Pod, allNodes []*schedulernodeinfo.NodeInfo) (*podAffinityMetadata, error) {
397+
func getPodAffinityMetadata(pod *v1.Pod, allNodes []*schedulernodeinfo.NodeInfo, havePodsWithAffinityNodes []*schedulernodeinfo.NodeInfo) (*podAffinityMetadata, error) {
391398
// existingPodAntiAffinityMap will be used later for efficient check on existing pods' anti-affinity
392-
existingPodAntiAffinityMap, err := getTPMapMatchingExistingAntiAffinity(pod, allNodes)
399+
existingPodAntiAffinityMap, err := getTPMapMatchingExistingAntiAffinity(pod, havePodsWithAffinityNodes)
393400
if err != nil {
394401
return nil, err
395402
}
@@ -759,7 +766,9 @@ func getTPMapMatchingExistingAntiAffinity(pod *v1.Pod, allNodes []*schedulernode
759766
errCh.SendErrorWithCancel(err, cancel)
760767
return
761768
}
762-
appendTopologyPairsMaps(existingPodTopologyMaps)
769+
if existingPodTopologyMaps != nil {
770+
appendTopologyPairsMaps(existingPodTopologyMaps)
771+
}
763772
}
764773
}
765774
workqueue.ParallelizeUntil(ctx, 16, len(allNodes), processNode)

pkg/scheduler/algorithm/priorities/interpod_affinity.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,10 +106,17 @@ func (ipa *InterPodAffinity) CalculateInterPodAffinityPriority(pod *v1.Pod, shar
106106

107107
// pm stores (1) all nodes that should be considered and (2) the so-far computed score for each node.
108108
pm := newPodAffinityPriorityMap(nodes)
109-
allNodes, err := sharedLister.NodeInfos().List()
109+
110+
allNodes, err := sharedLister.NodeInfos().HavePodsWithAffinityList()
110111
if err != nil {
111112
return nil, err
112113
}
114+
if hasAffinityConstraints || hasAntiAffinityConstraints {
115+
allNodes, err = sharedLister.NodeInfos().List()
116+
if err != nil {
117+
return nil, err
118+
}
119+
}
113120

114121
// convert the topology key based weights to the node name based weights
115122
var maxCount, minCount int64

pkg/scheduler/core/generic_scheduler.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,6 @@ func (g *genericScheduler) snapshot() error {
179179
// for cluster autoscaler integration.
180180
func (g *genericScheduler) PredicateMetadataProducer() predicates.PredicateMetadataProducer {
181181
return g.predicateMetaProducer
182-
183182
}
184183

185184
// Schedule tries to schedule the given pod to one of the nodes in the node list.

pkg/scheduler/internal/cache/cache.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,10 +239,14 @@ func (cache *schedulerCache) UpdateNodeInfoSnapshot(nodeSnapshot *nodeinfosnapsh
239239

240240
// Take a snapshot of the nodes order in the tree
241241
nodeSnapshot.NodeInfoList = make([]*schedulernodeinfo.NodeInfo, 0, cache.nodeTree.numNodes)
242+
nodeSnapshot.HavePodsWithAffinityNodeInfoList = make([]*schedulernodeinfo.NodeInfo, 0, cache.nodeTree.numNodes)
242243
for i := 0; i < cache.nodeTree.numNodes; i++ {
243244
nodeName := cache.nodeTree.next()
244245
if n := nodeSnapshot.NodeInfoMap[nodeName]; n != nil {
245246
nodeSnapshot.NodeInfoList = append(nodeSnapshot.NodeInfoList, n)
247+
if len(n.PodsWithAffinity()) > 0 {
248+
nodeSnapshot.HavePodsWithAffinityNodeInfoList = append(nodeSnapshot.HavePodsWithAffinityNodeInfoList, n)
249+
}
246250
} else {
247251
klog.Errorf("node %q exist in nodeTree but not in NodeInfoMap, this should not happen.", nodeName)
248252
}

pkg/scheduler/listers/fake/listers.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,12 @@ func (nodes NodeInfoLister) List() ([]*schedulernodeinfo.NodeInfo, error) {
262262
return nodes, nil
263263
}
264264

265+
// HavePodsWithAffinityList is supposed to list nodes with at least one pod with affinity. For the fake lister
266+
// we just return everything.
267+
func (nodes NodeInfoLister) HavePodsWithAffinityList() ([]*schedulernodeinfo.NodeInfo, error) {
268+
return nodes, nil
269+
}
270+
265271
// NewNodeInfoLister create a new fake NodeInfoLister from a slice of v1.Nodes.
266272
func NewNodeInfoLister(nodes []*v1.Node) schedulerlisters.NodeInfoLister {
267273
nodeInfoList := make([]*schedulernodeinfo.NodeInfo, len(nodes))

pkg/scheduler/listers/listers.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ type PodLister interface {
3838
type NodeInfoLister interface {
3939
// Returns the list of NodeInfos.
4040
List() ([]*schedulernodeinfo.NodeInfo, error)
41+
// Returns the list of NodeInfos of nodes with pods with affinity terms.
42+
HavePodsWithAffinityList() ([]*schedulernodeinfo.NodeInfo, error)
4143
// Returns the NodeInfo of the given node name.
4244
Get(nodeName string) (*schedulernodeinfo.NodeInfo, error)
4345
}

pkg/scheduler/nodeinfo/snapshot/snapshot.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@ type Snapshot struct {
3232
NodeInfoMap map[string]*schedulernodeinfo.NodeInfo
3333
// NodeInfoList is the list of nodes as ordered in the cache's nodeTree.
3434
NodeInfoList []*schedulernodeinfo.NodeInfo
35-
Generation int64
35+
// HavePodsWithAffinityNodeInfoList is the list of nodes with at least one pod declaring affinity terms.
36+
HavePodsWithAffinityNodeInfoList []*schedulernodeinfo.NodeInfo
37+
Generation int64
3638
}
3739

3840
var _ schedulerlisters.SharedLister = &Snapshot{}
@@ -48,13 +50,18 @@ func NewEmptySnapshot() *Snapshot {
4850
func NewSnapshot(pods []*v1.Pod, nodes []*v1.Node) *Snapshot {
4951
nodeInfoMap := schedulernodeinfo.CreateNodeNameToInfoMap(pods, nodes)
5052
nodeInfoList := make([]*schedulernodeinfo.NodeInfo, 0, len(nodes))
53+
havePodsWithAffinityNodeInfoList := make([]*schedulernodeinfo.NodeInfo, 0, len(nodes))
5154
for _, v := range nodeInfoMap {
5255
nodeInfoList = append(nodeInfoList, v)
56+
if len(v.PodsWithAffinity()) > 0 {
57+
havePodsWithAffinityNodeInfoList = append(havePodsWithAffinityNodeInfoList, v)
58+
}
5359
}
5460

5561
s := NewEmptySnapshot()
5662
s.NodeInfoMap = nodeInfoMap
5763
s.NodeInfoList = nodeInfoList
64+
s.HavePodsWithAffinityNodeInfoList = havePodsWithAffinityNodeInfoList
5865

5966
return s
6067
}
@@ -119,6 +126,11 @@ func (n *nodeInfoLister) List() ([]*schedulernodeinfo.NodeInfo, error) {
119126
return n.snapshot.NodeInfoList, nil
120127
}
121128

129+
// HavePodsWithAffinityList returns the list of nodes with at least one pods with inter-pod affinity
130+
func (n *nodeInfoLister) HavePodsWithAffinityList() ([]*schedulernodeinfo.NodeInfo, error) {
131+
return n.snapshot.HavePodsWithAffinityNodeInfoList, nil
132+
}
133+
122134
// Returns the NodeInfo of the given node name.
123135
func (n *nodeInfoLister) Get(nodeName string) (*schedulernodeinfo.NodeInfo, error) {
124136
if v, ok := n.snapshot.NodeInfoMap[nodeName]; ok {

0 commit comments

Comments
 (0)