diff --git a/pkg/scheduler/api/job_info.go b/pkg/scheduler/api/job_info.go index e219ed1b0e9..a56fac6b647 100644 --- a/pkg/scheduler/api/job_info.go +++ b/pkg/scheduler/api/job_info.go @@ -492,30 +492,11 @@ func (ji *JobInfo) GetMinResources() *Resource { // GetElasticResources returns those partly resources in allocated which are more than its minResource func (ji *JobInfo) GetElasticResources() *Resource { - elastic := EmptyResource() if ji.Allocated == nil { - return elastic + return EmptyResource() } minResource := ji.GetMinResources() - if ji.Allocated.MilliCPU > minResource.MilliCPU { - elastic.MilliCPU = ji.Allocated.MilliCPU - minResource.MilliCPU - } - if ji.Allocated.Memory > minResource.Memory { - elastic.Memory = ji.Allocated.Memory - minResource.Memory - } - - for k, v := range ji.Allocated.ScalarResources { - if k == v1.ResourcePods{ - continue - } - minv := minResource.ScalarResources[k] - if v > minv { - if elastic.ScalarResources == nil { - elastic.ScalarResources = map[v1.ResourceName]float64{} - } - elastic.ScalarResources[k] = v - minv - } - } + elastic := ExceedPart(ji.Allocated, minResource) return elastic } diff --git a/pkg/scheduler/api/resource_info.go b/pkg/scheduler/api/resource_info.go index d732fafcaaf..f6964df2885 100644 --- a/pkg/scheduler/api/resource_info.go +++ b/pkg/scheduler/api/resource_info.go @@ -709,3 +709,34 @@ func (r ResourceNameList) Contains(rr ResourceNameList) bool { func IsCountQuota(name v1.ResourceName) bool { return strings.HasPrefix(string(name), "count/") } + +// ExceedPart returns the partly resource in left which exceed right +func ExceedPart(left, right *Resource) *Resource { + if right == nil { + return left + } + diff := EmptyResource() + if left == nil { + return diff + } + if left.MilliCPU > right.MilliCPU { + diff.MilliCPU = left.MilliCPU - right.MilliCPU + } + if left.Memory > right.Memory { + diff.Memory = left.Memory - right.Memory + } + + for k, v := range left.ScalarResources { + if k == v1.ResourcePods { + continue + } + minv := right.ScalarResources[k] + if v > minv { + if diff.ScalarResources == nil { + diff.ScalarResources = map[v1.ResourceName]float64{} + } + diff.ScalarResources[k] = v - minv + } + } + return diff +} diff --git a/pkg/scheduler/plugins/proportion/proportion.go b/pkg/scheduler/plugins/proportion/proportion.go index 5baf64a7f5f..916f7a21537 100644 --- a/pkg/scheduler/plugins/proportion/proportion.go +++ b/pkg/scheduler/plugins/proportion/proportion.go @@ -117,7 +117,7 @@ func (pp *proportionPlugin) OnSessionOpen(ssn *framework.Session) { if len(queue.Queue.Spec.Guarantee.Resource) != 0 { attr.guarantee = api.NewResource(queue.Queue.Spec.Guarantee.Resource) } - realCapability := pp.totalResource.Clone().Sub(pp.totalGuarantee).Add(attr.guarantee) + realCapability := api.ExceedPart(pp.totalResource, pp.totalGuarantee).Add(attr.guarantee) if attr.capability == nil { attr.realCapability = realCapability } else {