Skip to content

Commit c238353

Browse files
Merge pull request volcano-sh#1851 from aidaizyy/aidaizyy-dev
fix pod cannot be allocated with sufficient resource
2 parents 2589449 + 19a940b commit c238353

File tree

3 files changed

+126
-23
lines changed

3 files changed

+126
-23
lines changed

pkg/scheduler/api/resource_info.go

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -480,27 +480,40 @@ func (r *Resource) SetScalar(name v1.ResourceName, quantity float64) {
480480
// e.g r resource is <cpu 2000.00, memory 4047845376.00, hugepages-2Mi 0.00, hugepages-1Gi 0.00>
481481
// rr resource is <cpu 3000.00, memory 1000.00>
482482
// return r resource is <cpu 2000.00, memory 1000.00, hugepages-2Mi 0.00, hugepages-1Gi 0.00>
483-
func (r *Resource) MinDimensionResource(rr *Resource) *Resource {
483+
// @param defaultValue "default value for resource dimension not defined in ScalarResources. Its value can only be one of 'Zero' and 'Infinity'"
484+
func (r *Resource) MinDimensionResource(rr *Resource, defaultValue DimensionDefaultValue) *Resource {
484485
if rr.MilliCPU < r.MilliCPU {
485486
r.MilliCPU = rr.MilliCPU
486487
}
487488
if rr.Memory < r.Memory {
488489
r.Memory = rr.Memory
489490
}
490491

492+
if r.ScalarResources == nil {
493+
return r
494+
}
495+
491496
if rr.ScalarResources == nil {
492-
if r.ScalarResources != nil {
493-
for name := range r.ScalarResources {
494-
r.ScalarResources[name] = 0
495-
}
497+
if defaultValue == Infinity {
498+
return r
496499
}
497-
} else {
498-
if r.ScalarResources != nil {
499-
for name, quant := range rr.ScalarResources {
500-
if quant < r.ScalarResources[name] {
501-
r.ScalarResources[name] = quant
502-
}
500+
501+
for name := range r.ScalarResources {
502+
r.ScalarResources[name] = 0
503+
}
504+
return r
505+
}
506+
507+
for name, quant := range r.ScalarResources {
508+
rQuant, ok := rr.ScalarResources[name]
509+
if ok {
510+
r.ScalarResources[name] = math.Min(quant, rQuant)
511+
} else {
512+
if defaultValue == Infinity {
513+
continue
503514
}
515+
516+
r.ScalarResources[name] = 0
504517
}
505518
}
506519
return r

pkg/scheduler/api/resource_info_test.go

Lines changed: 85 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ limitations under the License.
1717
package api
1818

1919
import (
20+
"math"
2021
"reflect"
2122
"testing"
2223

@@ -1091,7 +1092,7 @@ func TestEqual(t *testing.T) {
10911092
}
10921093
}
10931094

1094-
func TestMinDimensionResource(t *testing.T) {
1095+
func TestMinDimensionResourceZero(t *testing.T) {
10951096
tests := []struct {
10961097
resource1 *Resource
10971098
resource2 *Resource
@@ -1131,10 +1132,92 @@ func TestMinDimensionResource(t *testing.T) {
11311132
ScalarResources: map[v1.ResourceName]float64{"scalar.test/scalar1": 0, "hugepages-test": 2000},
11321133
},
11331134
},
1135+
{
1136+
resource1: &Resource{
1137+
MilliCPU: 4000,
1138+
Memory: 2000,
1139+
ScalarResources: map[v1.ResourceName]float64{"scalar.test/scalar1": 1, "hugepages-test": 2},
1140+
},
1141+
resource2: &Resource{
1142+
MilliCPU: 3000,
1143+
Memory: 2000,
1144+
ScalarResources: map[v1.ResourceName]float64{"scalar.test/scalar1": 0},
1145+
},
1146+
expected: &Resource{
1147+
MilliCPU: 3000,
1148+
Memory: 2000,
1149+
ScalarResources: map[v1.ResourceName]float64{"scalar.test/scalar1": 0, "hugepages-test": 0},
1150+
},
1151+
},
1152+
{
1153+
resource1: &Resource{
1154+
MilliCPU: 4000,
1155+
Memory: 4000,
1156+
ScalarResources: map[v1.ResourceName]float64{"scalar.test/scalar1": 1000, "hugepages-test": 2000},
1157+
},
1158+
resource2: &Resource{
1159+
MilliCPU: math.MaxFloat64,
1160+
Memory: 2000,
1161+
},
1162+
expected: &Resource{
1163+
MilliCPU: 4000,
1164+
Memory: 2000,
1165+
ScalarResources: map[v1.ResourceName]float64{"scalar.test/scalar1": 0, "hugepages-test": 0},
1166+
},
1167+
},
1168+
}
1169+
1170+
for _, test := range tests {
1171+
test.resource1.MinDimensionResource(test.resource2, Zero)
1172+
if !reflect.DeepEqual(test.expected, test.resource1) {
1173+
t.Errorf("expected: %#v, got: %#v", test.expected, test.resource1)
1174+
}
1175+
}
1176+
}
1177+
1178+
func TestMinDimensionResourceInfinity(t *testing.T) {
1179+
tests := []struct {
1180+
resource1 *Resource
1181+
resource2 *Resource
1182+
expected *Resource
1183+
}{
1184+
{
1185+
resource1: &Resource{
1186+
MilliCPU: 4000,
1187+
Memory: 2000,
1188+
ScalarResources: map[v1.ResourceName]float64{"scalar.test/scalar1": 1, "hugepages-test": 2},
1189+
},
1190+
resource2: &Resource{
1191+
MilliCPU: 3000,
1192+
Memory: 2000,
1193+
ScalarResources: map[v1.ResourceName]float64{"scalar.test/scalar1": 0},
1194+
},
1195+
expected: &Resource{
1196+
MilliCPU: 3000,
1197+
Memory: 2000,
1198+
ScalarResources: map[v1.ResourceName]float64{"scalar.test/scalar1": 0, "hugepages-test": 2},
1199+
},
1200+
},
1201+
{
1202+
resource1: &Resource{
1203+
MilliCPU: 4000,
1204+
Memory: 4000,
1205+
ScalarResources: map[v1.ResourceName]float64{"scalar.test/scalar1": 1000, "hugepages-test": 2000},
1206+
},
1207+
resource2: &Resource{
1208+
MilliCPU: math.MaxFloat64,
1209+
Memory: 2000,
1210+
},
1211+
expected: &Resource{
1212+
MilliCPU: 4000,
1213+
Memory: 2000,
1214+
ScalarResources: map[v1.ResourceName]float64{"scalar.test/scalar1": 1000, "hugepages-test": 2000},
1215+
},
1216+
},
11341217
}
11351218

11361219
for _, test := range tests {
1137-
test.resource1.MinDimensionResource(test.resource2)
1220+
test.resource1.MinDimensionResource(test.resource2, Infinity)
11381221
if !reflect.DeepEqual(test.expected, test.resource1) {
11391222
t.Errorf("expected: %#v, got: %#v", test.expected, test.resource1)
11401223
}

pkg/scheduler/plugins/proportion/proportion.go

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ limitations under the License.
1717
package proportion
1818

1919
import (
20+
"math"
2021
"reflect"
2122

2223
v1 "k8s.io/api/core/v1"
@@ -90,6 +91,12 @@ func (pp *proportionPlugin) OnSessionOpen(ssn *framework.Session) {
9091
}
9192
if len(queue.Queue.Spec.Capability) != 0 {
9293
attr.capability = api.NewResource(queue.Queue.Spec.Capability)
94+
if attr.capability.MilliCPU <= 0 {
95+
attr.capability.MilliCPU = math.MaxFloat64
96+
}
97+
if attr.capability.Memory <= 0 {
98+
attr.capability.Memory = math.MaxFloat64
99+
}
93100
}
94101

95102
pp.queueOpts[job.Queue] = attr
@@ -160,18 +167,18 @@ func (pp *proportionPlugin) OnSessionOpen(ssn *framework.Session) {
160167
oldDeserved := attr.deserved.Clone()
161168
attr.deserved.Add(remaining.Clone().Multi(float64(attr.weight) / float64(totalWeight)))
162169

163-
if attr.capability != nil && !attr.deserved.LessEqual(attr.capability, api.Infinity) {
164-
attr.deserved = helpers.Min(attr.deserved, attr.capability)
165-
attr.deserved = helpers.Min(attr.deserved, attr.request)
166-
meet[attr.queueID] = struct{}{}
167-
klog.V(4).Infof("queue <%s> is meet cause of the capability", attr.name)
168-
} else if attr.request.LessEqual(attr.deserved, api.Zero) {
169-
attr.deserved = helpers.Min(attr.deserved, attr.request)
170+
if attr.capability != nil {
171+
attr.deserved.MinDimensionResource(attr.capability, api.Infinity)
172+
}
173+
attr.deserved.MinDimensionResource(attr.request, api.Zero)
174+
klog.V(4).Infof("Format queue <%s> deserved resource to <%v>", attr.name, attr.deserved)
175+
176+
if attr.request.LessEqual(attr.deserved, api.Zero) {
170177
meet[attr.queueID] = struct{}{}
171178
klog.V(4).Infof("queue <%s> is meet", attr.name)
172-
} else {
173-
attr.deserved.MinDimensionResource(attr.request)
174-
klog.V(4).Infof("Format queue <%s> deserved resource to <%v>", attr.name, attr.deserved)
179+
} else if reflect.DeepEqual(attr.deserved, oldDeserved) {
180+
meet[attr.queueID] = struct{}{}
181+
klog.V(4).Infof("queue <%s> is meet cause of the capability", attr.name)
175182
}
176183
pp.updateShare(attr)
177184

0 commit comments

Comments
 (0)