From 09c244ef3cdb6e8bc2ace4efce6d8f2cd9baebff Mon Sep 17 00:00:00 2001
From: yusing <yusing@6uo.me>
Date: Thu, 5 Jun 2025 18:53:11 +0800
Subject: [PATCH] fix(route): add mutex lock for load balancer updates to
 prevent race conditions

---
 internal/route/reverse_proxy.go | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/internal/route/reverse_proxy.go b/internal/route/reverse_proxy.go
index 81ff5c9..e5522c8 100755
--- a/internal/route/reverse_proxy.go
+++ b/internal/route/reverse_proxy.go
@@ -3,6 +3,7 @@ package route
 import (
 	"crypto/tls"
 	"net/http"
+	"sync"
 
 	"github.com/yusing/go-proxy/agent/pkg/agent"
 	"github.com/yusing/go-proxy/agent/pkg/agentproxy"
@@ -156,12 +157,17 @@ func (r *ReveseProxyRoute) ServeHTTP(w http.ResponseWriter, req *http.Request) {
 	r.handler.ServeHTTP(w, req)
 }
 
+var lbLock sync.Mutex
+
 func (r *ReveseProxyRoute) addToLoadBalancer(parent task.Parent) {
 	var lb *loadbalancer.LoadBalancer
 	cfg := r.LoadBalance
+	lbLock.Lock()
+
 	l, ok := routes.HTTP.Get(cfg.Link)
 	var linked *ReveseProxyRoute
 	if ok {
+		lbLock.Unlock()
 		linked = l.(*ReveseProxyRoute)
 		lb = linked.loadBalancer
 		lb.UpdateConfigIfNeeded(cfg)
@@ -186,6 +192,7 @@ func (r *ReveseProxyRoute) addToLoadBalancer(parent task.Parent) {
 			routes.HTTP.DelKey(cfg.Link)
 			routes.All.DelKey(cfg.Link)
 		})
+		lbLock.Unlock()
 	}
 	r.loadBalancer = lb