From 8595bce33b81e0a28aa5e667959e24c62c3c8865 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Fri, 26 Oct 2018 12:06:21 +0200 Subject: [PATCH] better load balancing --- common/mux/client.go | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/common/mux/client.go b/common/mux/client.go index 95fa9bdd..06904b23 100644 --- a/common/mux/client.go +++ b/common/mux/client.go @@ -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()