|
|
@@ -70,14 +70,27 @@ func (p *IncrementalWorkerPicker) cleanup() {
|
|
|
p.workers = activeWorkers
|
|
|
}
|
|
|
|
|
|
+func (p *IncrementalWorkerPicker) findAvailable() int {
|
|
|
+ for idx, w := range p.workers {
|
|
|
+ if !w.IsFull() {
|
|
|
+ return idx
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return -1
|
|
|
+}
|
|
|
+
|
|
|
func (p *IncrementalWorkerPicker) pickInternal() (*ClientWorker, error, bool) {
|
|
|
p.access.Lock()
|
|
|
defer p.access.Unlock()
|
|
|
|
|
|
- for _, w := range p.workers {
|
|
|
- if !w.IsFull() {
|
|
|
- return w, nil, false
|
|
|
+ idx := p.findAvailable()
|
|
|
+ if idx >= 0 {
|
|
|
+ n := len(p.workers)
|
|
|
+ if n > 1 && idx != n-1 {
|
|
|
+ p.workers[n-1], p.workers[idx] = p.workers[idx], p.workers[n-1]
|
|
|
}
|
|
|
+ return p.workers[idx], nil, false
|
|
|
}
|
|
|
|
|
|
p.cleanup()
|