@@ -6,6 +6,7 @@ package factor
66import (
77 "sort"
88 "strconv"
9+ "sync"
910 "time"
1011
1112 "github.com/pingcap/tiproxy/lib/config"
@@ -24,8 +25,8 @@ const (
2425var _ policy.BalancePolicy = (* FactorBasedBalance )(nil )
2526
2627// FactorBasedBalance is the default balance policy.
27- // It's not concurrency-safe for now.
2828type FactorBasedBalance struct {
29+ sync.Mutex
2930 factors []Factor
3031 // to reduce memory allocation
3132 cachedList []scoredBackend
@@ -53,6 +54,8 @@ func NewFactorBasedBalance(lg *zap.Logger, mr metricsreader.MetricsReader) *Fact
5354// Init creates factors at the first time.
5455// TODO: create factors according to config and update policy when config changes.
5556func (fbb * FactorBasedBalance ) Init (cfg * config.Config ) {
57+ fbb .Lock ()
58+ defer fbb .Unlock ()
5659 fbb .factors = make ([]Factor , 0 , 7 )
5760 fbb .setFactors (cfg )
5861}
@@ -178,6 +181,8 @@ func (fbb *FactorBasedBalance) BackendToRoute(backends []policy.BackendCtx) poli
178181 return nil
179182 }
180183
184+ fbb .Lock ()
185+ defer fbb .Unlock ()
181186 scoredBackends := fbb .updateScore (backends )
182187 if ! fbb .canBeRouted (scoredBackends [0 ].scoreBits ) {
183188 return nil
@@ -240,6 +245,9 @@ func (fbb *FactorBasedBalance) BackendsToBalance(backends []policy.BackendCtx) (
240245 if len (backends ) <= 1 {
241246 return
242247 }
248+
249+ fbb .Lock ()
250+ defer fbb .Unlock ()
243251 scoredBackends := fbb .updateScore (backends )
244252 if ! fbb .canBeRouted (scoredBackends [0 ].scoreBits ) {
245253 return
@@ -304,10 +312,14 @@ func (fbb *FactorBasedBalance) canBeRouted(score uint64) bool {
304312}
305313
306314func (fbb * FactorBasedBalance ) SetConfig (cfg * config.Config ) {
315+ fbb .Lock ()
316+ defer fbb .Unlock ()
307317 fbb .setFactors (cfg )
308318}
309319
310320func (fbb * FactorBasedBalance ) Close () {
321+ fbb .Lock ()
322+ defer fbb .Unlock ()
311323 for _ , factor := range fbb .factors {
312324 factor .Close ()
313325 }
0 commit comments