diff --git a/pkg/scheduler/plugins/nodenumaresource/resource_manager.go b/pkg/scheduler/plugins/nodenumaresource/resource_manager.go index c1374bba5..ab36c82a2 100644 --- a/pkg/scheduler/plugins/nodenumaresource/resource_manager.go +++ b/pkg/scheduler/plugins/nodenumaresource/resource_manager.go @@ -457,9 +457,22 @@ func (c *resourceManager) getAvailableNUMANodeResources(nodeName string, topolog } func generateResourceHints(numaNodeResources []NUMANodeResource, podRequests corev1.ResourceList, totalAvailable map[int]corev1.ResourceList, numaScorer *resourceAllocationScorer) map[string][]topologymanager.NUMATopologyHint { + var resourceNamesByNUMA []corev1.ResourceName + for _, numaNodeResource := range numaNodeResources { + resourceNamesByNUMA = append(resourceNamesByNUMA, quotav1.ResourceNames(numaNodeResource.Resources)...) + } + numaNodesLackResource := map[corev1.ResourceName][]int{} + for _, resourceName := range resourceNamesByNUMA { + for nodeID, numaAvailable := range totalAvailable { + if available, ok := numaAvailable[resourceName]; !ok || available.IsZero() { + numaNodesLackResource[resourceName] = append(numaNodesLackResource[resourceName], nodeID) + } + } + } generator := hintsGenerator{ - minAffinitySize: make(map[corev1.ResourceName]int), - hints: map[string][]topologymanager.NUMATopologyHint{}, + numaNodesLackResource: numaNodesLackResource, + minAffinitySize: make(map[corev1.ResourceName]int), + hints: map[string][]topologymanager.NUMATopologyHint{}, } var memoryResourceNames []corev1.ResourceName for resourceName := range podRequests { @@ -533,8 +546,9 @@ func generateResourceHints(numaNodeResources []NUMANodeResource, podRequests cor } type hintsGenerator struct { - minAffinitySize map[corev1.ResourceName]int - hints map[string][]topologymanager.NUMATopologyHint + numaNodesLackResource map[corev1.ResourceName][]int + minAffinitySize map[corev1.ResourceName]int + hints map[string][]topologymanager.NUMATopologyHint } func (g *hintsGenerator) generateHints(mask bitmask.BitMask, score int64, totalAllocatable, totalFree corev1.ResourceList, podRequests corev1.ResourceList, resourceNames ...corev1.ResourceName) { @@ -545,6 +559,12 @@ func (g *hintsGenerator) generateHints(mask bitmask.BitMask, score int64, totalA } } + for _, resourceName := range resourceNames { + if mask.AnySet(g.numaNodesLackResource[resourceName]) { + return + } + } + nodeCount := mask.Count() for _, resourceName := range resourceNames { affinitySize := g.minAffinitySize[resourceName] diff --git a/pkg/scheduler/plugins/nodenumaresource/resource_manager_test.go b/pkg/scheduler/plugins/nodenumaresource/resource_manager_test.go index 77d08f25a..ab8217aaf 100644 --- a/pkg/scheduler/plugins/nodenumaresource/resource_manager_test.go +++ b/pkg/scheduler/plugins/nodenumaresource/resource_manager_test.go @@ -1367,13 +1367,6 @@ func TestResourceManagerGetTopologyHint(t *testing.T) { }(), Preferred: true, }, - { - NUMANodeAffinity: func() bitmask.BitMask { - mask, _ := bitmask.NewBitMask(0, 1) - return mask - }(), - Preferred: false, - }, }, }, wantErr: false, @@ -1495,13 +1488,6 @@ func TestResourceManagerGetTopologyHint(t *testing.T) { }(), Preferred: true, }, - { - NUMANodeAffinity: func() bitmask.BitMask { - mask, _ := bitmask.NewBitMask(0, 1) - return mask - }(), - Preferred: false, - }, }, }, wantErr: false,