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)