Unverified Commit 9aed9703 authored by Volcano Bot's avatar Volcano Bot Committed by GitHub
Browse files

Merge pull request #1712 from Thor-wl/0902-issue1710

fix diff function
parents 233d53ff fda68f6b
Showing with 201 additions and 25 deletions
+201 -25
...@@ -437,38 +437,42 @@ func (r *Resource) Equal(rr *Resource, defaultValue DimensionDefaultValue) bool ...@@ -437,38 +437,42 @@ func (r *Resource) Equal(rr *Resource, defaultValue DimensionDefaultValue) bool
} }
// Diff calculate the difference between two resource object // Diff calculate the difference between two resource object
func (r *Resource) Diff(rr *Resource) (*Resource, *Resource) { // Note: if `defaultValue` equals `Infinity`, the difference between two values will be `Infinity`, marked as -1
func (r *Resource) Diff(rr *Resource, defaultValue DimensionDefaultValue) (*Resource, *Resource) {
leftRes := r.Clone()
rightRes := rr.Clone()
increasedVal := EmptyResource() increasedVal := EmptyResource()
decreasedVal := EmptyResource() decreasedVal := EmptyResource()
if r.MilliCPU > rr.MilliCPU { r.setDefaultValue(leftRes, rightRes, defaultValue)
increasedVal.MilliCPU += r.MilliCPU - rr.MilliCPU
if leftRes.MilliCPU > rightRes.MilliCPU {
increasedVal.MilliCPU = leftRes.MilliCPU - rightRes.MilliCPU
} else { } else {
decreasedVal.MilliCPU += rr.MilliCPU - r.MilliCPU decreasedVal.MilliCPU = rightRes.MilliCPU - leftRes.MilliCPU
} }
if r.Memory > rr.Memory { if leftRes.Memory > rightRes.Memory {
increasedVal.Memory += r.Memory - rr.Memory increasedVal.Memory = leftRes.Memory - rightRes.Memory
} else { } else {
decreasedVal.Memory += rr.Memory - r.Memory decreasedVal.Memory = rightRes.Memory - leftRes.Memory
} }
for rName, rQuant := range r.ScalarResources { increasedVal.ScalarResources = make(map[v1.ResourceName]float64, 0)
rrQuant, ok := rr.ScalarResources[rName] decreasedVal.ScalarResources = make(map[v1.ResourceName]float64, 0)
for lName, lQuant := range leftRes.ScalarResources {
if !ok { rQuant, _ := rightRes.ScalarResources[lName]
rrQuant = 0 if lQuant == -1 {
increasedVal.ScalarResources[lName] = -1
continue
} }
if rQuant == -1 {
if rQuant > rrQuant { decreasedVal.ScalarResources[lName] = -1
if increasedVal.ScalarResources == nil { continue
increasedVal.ScalarResources = map[v1.ResourceName]float64{} }
} if lQuant > rQuant {
increasedVal.ScalarResources[rName] += rQuant - rrQuant increasedVal.ScalarResources[lName] = lQuant - rQuant
} else { } else {
if decreasedVal.ScalarResources == nil { decreasedVal.ScalarResources[lName] = rQuant - lQuant
decreasedVal.ScalarResources = map[v1.ResourceName]float64{}
}
decreasedVal.ScalarResources[rName] += rrQuant - rQuant
} }
} }
......
...@@ -289,6 +289,179 @@ func TestSubResource(t *testing.T) { ...@@ -289,6 +289,179 @@ func TestSubResource(t *testing.T) {
} }
} }
func TestDiff(t *testing.T) {
testsForDefaultZero := []struct {
resource1 *Resource
resource2 *Resource
expectedIncreased *Resource
expectedDecreased *Resource
}{
{
resource1: &Resource{},
resource2: &Resource{},
expectedIncreased: &Resource{
ScalarResources: make(map[v1.ResourceName]float64, 0),
},
expectedDecreased: &Resource{
ScalarResources: make(map[v1.ResourceName]float64, 0),
},
},
{
resource1: &Resource{
MilliCPU: 1000,
Memory: 2000,
},
resource2: &Resource{},
expectedIncreased: &Resource{
MilliCPU: 1000,
Memory: 2000,
ScalarResources: make(map[v1.ResourceName]float64, 0),
},
expectedDecreased: &Resource{
ScalarResources: make(map[v1.ResourceName]float64, 0),
},
},
{
resource1: &Resource{},
resource2: &Resource{
MilliCPU: 1000,
Memory: 2000,
},
expectedIncreased: &Resource{
ScalarResources: make(map[v1.ResourceName]float64, 0),
},
expectedDecreased: &Resource{
MilliCPU: 1000,
Memory: 2000,
ScalarResources: make(map[v1.ResourceName]float64, 0),
},
},
{
resource1: &Resource{
MilliCPU: 1000,
Memory: 2000,
ScalarResources: map[v1.ResourceName]float64{"scalar.test/scalar1": 1000},
},
resource2: &Resource{
MilliCPU: 2000,
Memory: 1000,
},
expectedIncreased: &Resource{
Memory: 1000,
ScalarResources: map[v1.ResourceName]float64{"scalar.test/scalar1": 1000},
},
expectedDecreased: &Resource{
MilliCPU: 1000,
ScalarResources: make(map[v1.ResourceName]float64, 0),
},
},
{
resource1: &Resource{
MilliCPU: 2000,
Memory: 1000,
},
resource2: &Resource{
MilliCPU: 1000,
Memory: 2000,
ScalarResources: map[v1.ResourceName]float64{"scalar.test/scalar1": 1000},
},
expectedIncreased: &Resource{
MilliCPU: 1000,
ScalarResources: make(map[v1.ResourceName]float64, 0),
},
expectedDecreased: &Resource{
Memory: 1000,
ScalarResources: map[v1.ResourceName]float64{"scalar.test/scalar1": 1000},
},
},
{
resource1: &Resource{
MilliCPU: 1000,
Memory: 2000,
ScalarResources: map[v1.ResourceName]float64{"scalar.test/scalar1": 3000},
},
resource2: &Resource{
MilliCPU: 2000,
Memory: 1000,
ScalarResources: map[v1.ResourceName]float64{"scalar.test/scalar1": 1000},
},
expectedIncreased: &Resource{
Memory: 1000,
ScalarResources: map[v1.ResourceName]float64{"scalar.test/scalar1": 2000},
},
expectedDecreased: &Resource{
MilliCPU: 1000,
ScalarResources: make(map[v1.ResourceName]float64, 0),
},
},
}
testsForDefaultInfinity := []struct {
resource1 *Resource
resource2 *Resource
expectedIncreased *Resource
expectedDecreased *Resource
}{
{
resource1: &Resource{
MilliCPU: 1000,
Memory: 2000,
ScalarResources: map[v1.ResourceName]float64{"scalar.test/scalar1": 1000},
},
resource2: &Resource{
MilliCPU: 2000,
Memory: 1000,
},
expectedIncreased: &Resource{
Memory: 1000,
ScalarResources: make(map[v1.ResourceName]float64, 0),
},
expectedDecreased: &Resource{
MilliCPU: 1000,
ScalarResources: map[v1.ResourceName]float64{"scalar.test/scalar1": -1},
},
},
{
resource1: &Resource{
MilliCPU: 2000,
Memory: 1000,
},
resource2: &Resource{
MilliCPU: 1000,
Memory: 2000,
ScalarResources: map[v1.ResourceName]float64{"scalar.test/scalar1": 1000},
},
expectedIncreased: &Resource{
MilliCPU: 1000,
ScalarResources: map[v1.ResourceName]float64{"scalar.test/scalar1": -1},
},
expectedDecreased: &Resource{
Memory: 1000,
ScalarResources: make(map[v1.ResourceName]float64, 0),
},
},
}
for _, test := range testsForDefaultZero {
increased, decreased := test.resource1.Diff(test.resource2, Zero)
if !reflect.DeepEqual(test.expectedIncreased, increased) {
t.Errorf("expected: %#v, got: %#v", test.expectedIncreased, increased)
}
if !reflect.DeepEqual(test.expectedDecreased, decreased) {
t.Errorf("expected: %#v, got: %#v", test.expectedDecreased, decreased)
}
}
for _, test := range testsForDefaultInfinity {
increased, decreased := test.resource1.Diff(test.resource2, Infinity)
if !reflect.DeepEqual(test.expectedIncreased, increased) {
t.Errorf("expected: %#v, got: %#v", test.expectedIncreased, increased)
}
if !reflect.DeepEqual(test.expectedDecreased, decreased) {
t.Errorf("expected: %#v, got: %#v", test.expectedDecreased, decreased)
}
}
}
func TestLess(t *testing.T) { func TestLess(t *testing.T) {
testsForDefaultZero := []struct { testsForDefaultZero := []struct {
resource1 *Resource resource1 *Resource
......
...@@ -178,7 +178,7 @@ func (pp *proportionPlugin) OnSessionOpen(ssn *framework.Session) { ...@@ -178,7 +178,7 @@ func (pp *proportionPlugin) OnSessionOpen(ssn *framework.Session) {
klog.V(4).Infof("The attributes of queue <%s> in proportion: deserved <%v>, allocate <%v>, request <%v>, share <%0.2f>", klog.V(4).Infof("The attributes of queue <%s> in proportion: deserved <%v>, allocate <%v>, request <%v>, share <%0.2f>",
attr.name, attr.deserved, attr.allocated, attr.request, attr.share) attr.name, attr.deserved, attr.allocated, attr.request, attr.share)
increased, decreased := attr.deserved.Diff(oldDeserved) increased, decreased := attr.deserved.Diff(oldDeserved, api.Zero)
increasedDeserved.Add(increased) increasedDeserved.Add(increased)
decreasedDeserved.Add(decreased) decreasedDeserved.Add(decreased)
...@@ -254,7 +254,7 @@ func (pp *proportionPlugin) OnSessionOpen(ssn *framework.Session) { ...@@ -254,7 +254,7 @@ func (pp *proportionPlugin) OnSessionOpen(ssn *framework.Session) {
underUsedResNames := api.ResourceNameList{} underUsedResNames := api.ResourceNameList{}
attr := pp.queueOpts[queue.UID] attr := pp.queueOpts[queue.UID]
_, underUsedResource := attr.allocated.Diff(attr.deserved) _, underUsedResource := attr.allocated.Diff(attr.deserved, api.Zero)
if underUsedResource.MilliCPU >= api.GetMinResource() { if underUsedResource.MilliCPU >= api.GetMinResource() {
underUsedResNames = append(underUsedResNames, v1.ResourceCPU) underUsedResNames = append(underUsedResNames, v1.ResourceCPU)
} }
...@@ -268,7 +268,6 @@ func (pp *proportionPlugin) OnSessionOpen(ssn *framework.Session) { ...@@ -268,7 +268,6 @@ func (pp *proportionPlugin) OnSessionOpen(ssn *framework.Session) {
queue.Name, attr.deserved, attr.allocated, attr.share, underUsedResNames) queue.Name, attr.deserved, attr.allocated, attr.share, underUsedResNames)
return underUsedResNames return underUsedResNames
}) })
ssn.AddJobEnqueueableFn(pp.Name(), func(obj interface{}) int { ssn.AddJobEnqueueableFn(pp.Name(), func(obj interface{}) int {
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment