diff --git a/lib/gat/pool/pool.go b/lib/gat/pool/pool.go index 5fff28b15b75b1dd14363c82ab3b857d410a6e55..161cdeb4a99859cd74de77cb061508593a0ea5c9 100644 --- a/lib/gat/pool/pool.go +++ b/lib/gat/pool/pool.go @@ -25,7 +25,7 @@ type Pool struct { closed chan struct{} - backingOff atomic.Bool + scalingUp atomic.Bool recipes map[string]*recipe.Recipe clients map[uuid.UUID]*Client @@ -147,14 +147,13 @@ func (T *Pool) removeRecipe(name string) { } func (T *Pool) scaleUp() { - backoff := T.options.ServerReconnectInitialTime - backingOff := false + if T.scalingUp.Swap(true) { + // another person is trying to scale up this pool already + return + } + defer T.scalingUp.Store(false) - defer func() { - if backingOff { - T.backingOff.Store(false) - } - }() + backoff := T.options.ServerReconnectInitialTime for { select { @@ -163,11 +162,6 @@ func (T *Pool) scaleUp() { default: } - if !backingOff && T.backingOff.Load() { - // already in backoff - return - } - name, r := func() (string, *recipe.Recipe) { T.mu.RLock() defer T.mu.RUnlock() @@ -199,13 +193,6 @@ func (T *Pool) scaleUp() { return } - if !backingOff { - if T.backingOff.Swap(true) { - return - } - backingOff = true - } - log.Printf("failed to dial server. trying again in %v", backoff) time.Sleep(backoff)