-
Notifications
You must be signed in to change notification settings - Fork 134
/
fairness.go
64 lines (55 loc) · 2.02 KB
/
fairness.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package fairness
import (
"github.com/pkg/errors"
"k8s.io/apimachinery/pkg/api/resource"
"github.com/armadaproject/armada/internal/scheduler/schedulerobjects"
)
// QueueRepository is a minimal representation of a queue repository used for computing fairness.
type QueueRepository interface {
GetQueue(name string) (Queue, bool)
}
// Queue is a minimal representation of a queue used for computing fairness.
type Queue interface {
// GetAllocation returns the current allocation of the queue.
GetAllocation() schedulerobjects.ResourceList
GetWeight() float64
}
// FairnessCostProvider captures algorithms to compute the cost of an allocation.
type FairnessCostProvider interface {
CostFromQueue(queue Queue) float64
CostFromAllocationAndWeight(allocation schedulerobjects.ResourceList, weight float64) float64
}
type DominantResourceFairness struct {
// Total resources across all nodes.
totalResources schedulerobjects.ResourceList
// Resources considered when computing DominantResourceFairness.
resourcesToConsider []string
}
func NewDominantResourceFairness(totalResources schedulerobjects.ResourceList, resourcesToConsider []string) (*DominantResourceFairness, error) {
if len(resourcesToConsider) == 0 {
return nil, errors.New("resourcesToConsider is empty")
}
return &DominantResourceFairness{
totalResources: totalResources,
resourcesToConsider: resourcesToConsider,
}, nil
}
func (f *DominantResourceFairness) CostFromQueue(queue Queue) float64 {
return f.CostFromAllocationAndWeight(queue.GetAllocation(), queue.GetWeight())
}
func (f *DominantResourceFairness) CostFromAllocationAndWeight(allocation schedulerobjects.ResourceList, weight float64) float64 {
var cost float64
for _, t := range f.resourcesToConsider {
capacity := f.totalResources.Get(t)
if capacity.Equal(resource.Quantity{}) {
// Ignore any resources with zero capacity.
continue
}
q := allocation.Get(t)
tcost := float64(q.MilliValue()) / float64(capacity.MilliValue())
if tcost > cost {
cost = tcost
}
}
return cost / weight
}