forked from TrueCloudLab/frostfs-qos
100 lines
1.7 KiB
Go
100 lines
1.7 KiB
Go
package scheduling
|
|
|
|
type queueItem interface {
|
|
ts() float64
|
|
setIndex(idx int)
|
|
}
|
|
|
|
type queue struct {
|
|
items []queueItem
|
|
}
|
|
|
|
// Len implements heap.Interface.
|
|
func (q *queue) Len() int {
|
|
return len(q.items)
|
|
}
|
|
|
|
// Less implements heap.Interface.
|
|
func (q *queue) Less(i int, j int) bool {
|
|
return q.items[i].ts() < q.items[j].ts()
|
|
}
|
|
|
|
// Pop implements heap.Interface.
|
|
func (q *queue) Pop() any {
|
|
n := len(q.items)
|
|
item := q.items[n-1]
|
|
q.items[n-1] = nil
|
|
q.items = q.items[0 : n-1]
|
|
item.setIndex(invalidIndex)
|
|
return item
|
|
}
|
|
|
|
// Push implements heap.Interface.
|
|
func (q *queue) Push(x any) {
|
|
it := x.(queueItem)
|
|
it.setIndex(q.Len())
|
|
q.items = append(q.items, it)
|
|
}
|
|
|
|
// Swap implements heap.Interface.
|
|
func (q *queue) Swap(i int, j int) {
|
|
q.items[i], q.items[j] = q.items[j], q.items[i]
|
|
q.items[i].setIndex(i)
|
|
q.items[j].setIndex(j)
|
|
}
|
|
|
|
var _ queueItem = &reservationMQueueItem{}
|
|
|
|
type reservationMQueueItem struct {
|
|
r *request
|
|
}
|
|
|
|
func (i *reservationMQueueItem) ts() float64 {
|
|
return i.r.reservation
|
|
}
|
|
|
|
func (i *reservationMQueueItem) setIndex(idx int) {
|
|
i.r.reservationIdx = idx
|
|
}
|
|
|
|
var _ queueItem = &limitMQueueItem{}
|
|
|
|
type limitMQueueItem struct {
|
|
r *request
|
|
}
|
|
|
|
func (i *limitMQueueItem) ts() float64 {
|
|
return i.r.limit
|
|
}
|
|
|
|
func (i *limitMQueueItem) setIndex(idx int) {
|
|
i.r.limitIdx = idx
|
|
}
|
|
|
|
var _ queueItem = &sharesMQueueItem{}
|
|
|
|
type sharesMQueueItem struct {
|
|
r *request
|
|
}
|
|
|
|
func (i *sharesMQueueItem) ts() float64 {
|
|
return i.r.shares
|
|
}
|
|
|
|
func (i *sharesMQueueItem) setIndex(idx int) {
|
|
i.r.sharesIdx = idx
|
|
}
|
|
|
|
var _ queueItem = &readyMQueueItem{}
|
|
|
|
type readyMQueueItem struct {
|
|
r *request
|
|
}
|
|
|
|
func (i *readyMQueueItem) ts() float64 {
|
|
return i.r.shares
|
|
}
|
|
|
|
func (i *readyMQueueItem) setIndex(idx int) {
|
|
i.r.readyIdx = idx
|
|
}
|