les: move client pool to les/vflux/server (#22495)
* les: move client pool to les/vflux/server * les/vflux/server: un-expose NodeBalance, remove unused fn, fix bugs * tests/fuzzers/vflux: add ClientPool fuzzer * les/vflux/server: fixed balance tests * les: rebase fix * les/vflux/server: fixed more bugs * les/vflux/server: unexported NodeStateMachine fields and flags * les/vflux/server: unexport all internal components and functions * les/vflux/server: fixed priorityPool test * les/vflux/server: polish balance * les/vflux/server: fixed mutex locking error * les/vflux/server: priorityPool bug fixed * common/prque: make Prque wrap-around priority handling optional * les/vflux/server: rename funcs, small optimizations * les/vflux/server: fixed timeUntil * les/vflux/server: separated balance.posValue and negValue * les/vflux/server: polish setup * les/vflux/server: enforce capacity curve monotonicity * les/vflux/server: simplified requestCapacity * les/vflux/server: requestCapacity with target range, no iterations in SetCapacity * les/vflux/server: minor changes * les/vflux/server: moved default factors to balanceTracker * les/vflux/server: set inactiveFlag in priorityPool * les/vflux/server: moved related metrics to vfs package * les/vflux/client: make priorityPool temp state logic cleaner * les/vflux/server: changed log.Crit to log.Error * add vflux fuzzer to oss-fuzz Co-authored-by: rjl493456442 <garyrong0905@gmail.com>
This commit is contained in:
@ -55,7 +55,7 @@ type (
|
||||
// NewLazyQueue creates a new lazy queue
|
||||
func NewLazyQueue(setIndex SetIndexCallback, priority PriorityCallback, maxPriority MaxPriorityCallback, clock mclock.Clock, refreshPeriod time.Duration) *LazyQueue {
|
||||
q := &LazyQueue{
|
||||
popQueue: newSstack(nil),
|
||||
popQueue: newSstack(nil, false),
|
||||
setIndex: setIndex,
|
||||
priority: priority,
|
||||
maxPriority: maxPriority,
|
||||
@ -71,8 +71,8 @@ func NewLazyQueue(setIndex SetIndexCallback, priority PriorityCallback, maxPrior
|
||||
|
||||
// Reset clears the contents of the queue
|
||||
func (q *LazyQueue) Reset() {
|
||||
q.queue[0] = newSstack(q.setIndex0)
|
||||
q.queue[1] = newSstack(q.setIndex1)
|
||||
q.queue[0] = newSstack(q.setIndex0, false)
|
||||
q.queue[1] = newSstack(q.setIndex1, false)
|
||||
}
|
||||
|
||||
// Refresh performs queue re-evaluation if necessary
|
||||
|
@ -28,7 +28,12 @@ type Prque struct {
|
||||
|
||||
// New creates a new priority queue.
|
||||
func New(setIndex SetIndexCallback) *Prque {
|
||||
return &Prque{newSstack(setIndex)}
|
||||
return &Prque{newSstack(setIndex, false)}
|
||||
}
|
||||
|
||||
// NewWrapAround creates a new priority queue with wrap-around priority handling.
|
||||
func NewWrapAround(setIndex SetIndexCallback) *Prque {
|
||||
return &Prque{newSstack(setIndex, true)}
|
||||
}
|
||||
|
||||
// Pushes a value with a given priority into the queue, expanding if necessary.
|
||||
|
@ -31,22 +31,24 @@ type SetIndexCallback func(data interface{}, index int)
|
||||
// the stack (heap) functionality and the Len, Less and Swap methods for the
|
||||
// sortability requirements of the heaps.
|
||||
type sstack struct {
|
||||
setIndex SetIndexCallback
|
||||
size int
|
||||
capacity int
|
||||
offset int
|
||||
setIndex SetIndexCallback
|
||||
size int
|
||||
capacity int
|
||||
offset int
|
||||
wrapAround bool
|
||||
|
||||
blocks [][]*item
|
||||
active []*item
|
||||
}
|
||||
|
||||
// Creates a new, empty stack.
|
||||
func newSstack(setIndex SetIndexCallback) *sstack {
|
||||
func newSstack(setIndex SetIndexCallback, wrapAround bool) *sstack {
|
||||
result := new(sstack)
|
||||
result.setIndex = setIndex
|
||||
result.active = make([]*item, blockSize)
|
||||
result.blocks = [][]*item{result.active}
|
||||
result.capacity = blockSize
|
||||
result.wrapAround = wrapAround
|
||||
return result
|
||||
}
|
||||
|
||||
@ -94,7 +96,11 @@ func (s *sstack) Len() int {
|
||||
// Compares the priority of two elements of the stack (higher is first).
|
||||
// Required by sort.Interface.
|
||||
func (s *sstack) Less(i, j int) bool {
|
||||
return (s.blocks[i/blockSize][i%blockSize].priority - s.blocks[j/blockSize][j%blockSize].priority) > 0
|
||||
a, b := s.blocks[i/blockSize][i%blockSize].priority, s.blocks[j/blockSize][j%blockSize].priority
|
||||
if s.wrapAround {
|
||||
return a-b > 0
|
||||
}
|
||||
return a > b
|
||||
}
|
||||
|
||||
// Swaps two elements in the stack. Required by sort.Interface.
|
||||
@ -110,5 +116,5 @@ func (s *sstack) Swap(i, j int) {
|
||||
|
||||
// Resets the stack, effectively clearing its contents.
|
||||
func (s *sstack) Reset() {
|
||||
*s = *newSstack(s.setIndex)
|
||||
*s = *newSstack(s.setIndex, false)
|
||||
}
|
||||
|
@ -21,7 +21,7 @@ func TestSstack(t *testing.T) {
|
||||
for i := 0; i < size; i++ {
|
||||
data[i] = &item{rand.Int(), rand.Int63()}
|
||||
}
|
||||
stack := newSstack(nil)
|
||||
stack := newSstack(nil, false)
|
||||
for rep := 0; rep < 2; rep++ {
|
||||
// Push all the data into the stack, pop out every second
|
||||
secs := []*item{}
|
||||
@ -55,7 +55,7 @@ func TestSstackSort(t *testing.T) {
|
||||
data[i] = &item{rand.Int(), int64(i)}
|
||||
}
|
||||
// Push all the data into the stack
|
||||
stack := newSstack(nil)
|
||||
stack := newSstack(nil, false)
|
||||
for _, val := range data {
|
||||
stack.Push(val)
|
||||
}
|
||||
@ -76,7 +76,7 @@ func TestSstackReset(t *testing.T) {
|
||||
for i := 0; i < size; i++ {
|
||||
data[i] = &item{rand.Int(), rand.Int63()}
|
||||
}
|
||||
stack := newSstack(nil)
|
||||
stack := newSstack(nil, false)
|
||||
for rep := 0; rep < 2; rep++ {
|
||||
// Push all the data into the stack, pop out every second
|
||||
secs := []*item{}
|
||||
|
Reference in New Issue
Block a user