From ed2b6b71629968c3a680f844ec1006889cdbe937 Mon Sep 17 00:00:00 2001 From: "wangjianyu.wjy" Date: Mon, 22 Apr 2024 15:44:23 +0800 Subject: [PATCH] scheduler: remove invalid hint in which some numaNode lack resource Signed-off-by: wangjianyu.wjy --- .../nodenumaresource/resource_manager.go | 28 ++++++++++++++++--- .../nodenumaresource/resource_manager_test.go | 14 ---------- 2 files changed, 24 insertions(+), 18 deletions(-) diff --git a/pkg/scheduler/plugins/nodenumaresource/resource_manager.go b/pkg/scheduler/plugins/nodenumaresource/resource_manager.go index be3a438c5..e063d2ece 100644 --- a/pkg/scheduler/plugins/nodenumaresource/resource_manager.go +++ b/pkg/scheduler/plugins/nodenumaresource/resource_manager.go @@ -416,9 +416,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 { @@ -492,8 +505,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) { @@ -504,6 +518,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 9ec9215e5..f3a4cf543 100644 --- a/pkg/scheduler/plugins/nodenumaresource/resource_manager_test.go +++ b/pkg/scheduler/plugins/nodenumaresource/resource_manager_test.go @@ -678,13 +678,6 @@ func TestResourceManagerGetTopologyHint(t *testing.T) { }(), Preferred: true, }, - { - NUMANodeAffinity: func() bitmask.BitMask { - mask, _ := bitmask.NewBitMask(0, 1) - return mask - }(), - Preferred: false, - }, }, }, wantErr: false, @@ -806,13 +799,6 @@ func TestResourceManagerGetTopologyHint(t *testing.T) { }(), Preferred: true, }, - { - NUMANodeAffinity: func() bitmask.BitMask { - mask, _ := bitmask.NewBitMask(0, 1) - return mask - }(), - Preferred: false, - }, }, }, wantErr: false,