diff --git a/pkg/scheduler/policy/gpu_policy.go b/pkg/scheduler/policy/gpu_policy.go index 272e199b42..7cf027738b 100644 --- a/pkg/scheduler/policy/gpu_policy.go +++ b/pkg/scheduler/policy/gpu_policy.go @@ -57,6 +57,10 @@ func (l DeviceUsageList) Less(i, j int) bool { } func (ds *DeviceListsScore) ComputeScore(requests device.ContainerDeviceRequests) { + if ds.Device == nil || ds.Device.Count == 0 || ds.Device.Totalcore == 0 || ds.Device.Totalmem == 0 { + ds.Score = 0 + return + } request, core, mem := int32(0), int32(0), int32(0) // Here we are required to use the same type device for _, container := range requests { diff --git a/pkg/scheduler/policy/gpu_policy_test.go b/pkg/scheduler/policy/gpu_policy_test.go index c17b4fd261..012d281b0f 100644 --- a/pkg/scheduler/policy/gpu_policy_test.go +++ b/pkg/scheduler/policy/gpu_policy_test.go @@ -203,6 +203,30 @@ func TestComputeScore(t *testing.T) { requests device.ContainerDeviceRequests expectedScore float32 }{ + { + name: "Zero capacity device returns score 0 without panic", + device: &device.DeviceUsage{ + ID: "test-device", + Type: "type1", + Count: 0, + Totalcore: 0, + Totalmem: 0, + }, + requests: make(device.ContainerDeviceRequests), + expectedScore: 0, + }, + { + name: "Partial zero capacity (Count=0) returns score 0 without panic", + device: &device.DeviceUsage{ + ID: "test-device", + Type: "type1", + Count: 0, + Totalcore: 8, + Totalmem: 4096, + }, + requests: make(device.ContainerDeviceRequests), + expectedScore: 0, + }, { name: "ContainerDeviceRequests has no data", device: &device.DeviceUsage{ diff --git a/pkg/scheduler/policy/node_policy.go b/pkg/scheduler/policy/node_policy.go index a6b6392bce..b54fc3b3fb 100644 --- a/pkg/scheduler/policy/node_policy.go +++ b/pkg/scheduler/policy/node_policy.go @@ -87,6 +87,10 @@ func (ns *NodeScore) ComputeDefaultScore(devices DeviceUsageList) { totalCore += deviceLists.Device.Totalcore totalMem += deviceLists.Device.Totalmem } + if total == 0 || totalCore == 0 || totalMem == 0 { + ns.Score = 0 + return + } useScore := float32(used) / float32(total) coreScore := float32(usedCore) / float32(totalCore) memScore := float32(usedMem) / float32(totalMem) diff --git a/pkg/scheduler/policy/node_policy_test.go b/pkg/scheduler/policy/node_policy_test.go index b59d57aa8b..0dd3b29e45 100644 --- a/pkg/scheduler/policy/node_policy_test.go +++ b/pkg/scheduler/policy/node_policy_test.go @@ -347,6 +347,33 @@ func TestComputeDefaultScore(t *testing.T) { devices DeviceUsageList wantScore float32 }{ + { + name: "Zero capacity devices returns score 0 without panic", + nodeScore: NodeScore{ + NodeID: "node-zero", + Score: 0.0, + }, + devices: DeviceUsageList{ + DeviceLists: []*DeviceListsScore{ + {Device: &device.DeviceUsage{ + Count: 0, Totalcore: 0, Totalmem: 0, + Used: 0, Usedcores: 0, Usedmem: 0, + }, Score: 0}, + }, + }, + wantScore: 0, + }, + { + name: "Empty device list returns score 0 without panic", + nodeScore: NodeScore{ + NodeID: "node-empty", + Score: 0.0, + }, + devices: DeviceUsageList{ + DeviceLists: []*DeviceListsScore{}, + }, + wantScore: 0, + }, { name: "Test with no devices", nodeScore: NodeScore{