70 lines
1.5 KiB
Go
70 lines
1.5 KiB
Go
package strategy
|
||
|
||
import (
|
||
"errors"
|
||
"gitlink.org.cn/jcce-pcm/pcm-coordinator/api/internal/scheduler/entity"
|
||
)
|
||
|
||
type StaticWeightStrategy struct {
|
||
// TODO: add fields
|
||
|
||
//每个
|
||
num int32
|
||
weights []entity.WeightP
|
||
}
|
||
|
||
func (ps *StaticWeightStrategy) Schedule() ([]*AssignedCluster, error) {
|
||
// TODO: implement the scheduling logic return nil, nil
|
||
|
||
if ps.num < 1 {
|
||
return nil, errors.New("numbers must be greater than 0")
|
||
}
|
||
|
||
if ps.weights == nil {
|
||
return nil, errors.New("weight must be set")
|
||
}
|
||
|
||
var weightSum int32
|
||
weightSum = 0
|
||
for _, w := range ps.weights {
|
||
weightSum += w.Weight
|
||
}
|
||
|
||
weightRatio := make([]float64, len(ps.weights))
|
||
for i, w := range ps.weights {
|
||
weightRatio[i] = float64(w.Weight) / float64(weightSum)
|
||
}
|
||
|
||
var rest = ps.num
|
||
var results []*AssignedCluster
|
||
|
||
for i := 0; i < len(ps.weights); i++ {
|
||
|
||
var n = int(float64(ps.num) * weightRatio[i])
|
||
rest -= int32(n)
|
||
|
||
cluster := &AssignedCluster{ParticipantId: ps.weights[i].Participant_id, Name: ps.weights[i].Name, Replicas: int32(n)}
|
||
results = append(results, cluster)
|
||
}
|
||
|
||
if rest != 0 {
|
||
if rest < 0 { // 如果差值小于0,需要增加某些元素的值
|
||
for i := len(ps.weights) - 1; rest < 0 && i >= 0; i-- {
|
||
if results[i].Replicas < ps.weights[i].Weight {
|
||
results[i].Replicas++
|
||
rest++
|
||
}
|
||
}
|
||
} else {
|
||
for i := len(ps.weights) - 1; rest > 0 && i >= 0; i-- {
|
||
if results[i].Replicas < ps.weights[i].Weight {
|
||
results[i].Replicas--
|
||
rest--
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
return results, nil
|
||
}
|