@@ -24,8 +24,6 @@ import (
2424 "sync/atomic"
2525 "time"
2626
27- "golang.org/x/sync/singleflight"
28-
2927 "github.com/cloudwego/kitex/pkg/diagnosis"
3028 "github.com/cloudwego/kitex/pkg/discovery"
3129 "github.com/cloudwego/kitex/pkg/klog"
@@ -41,7 +39,7 @@ const (
4139
4240var (
4341 balancerFactories sync.Map // key: resolver name + loadbalance name
44- balancerFactoriesSfg singleflight. Group
42+ balancerFactoriesSfg utils. SingleFlightGroup
4543)
4644
4745// Options for create builder
@@ -88,7 +86,7 @@ type BalancerFactory struct {
8886 resolver discovery.Resolver
8987 balancer loadbalance.Loadbalancer
9088 rebalancer loadbalance.Rebalancer
91- sfg singleflight. Group
89+ sfg utils. SingleFlightGroup
9290}
9391
9492func cacheKey (resolver , balancer string , opts Options ) string {
@@ -120,15 +118,15 @@ func NewBalancerFactory(resolver discovery.Resolver, balancer loadbalance.Loadba
120118 return newBalancerFactory (resolver , balancer , opts )
121119 }
122120 uniqueKey := cacheKey (resolver .Name (), balancer .Name (), opts )
123- val , ok := balancerFactories . Load (uniqueKey )
124- if ok {
125- return val .( * BalancerFactory )
126- }
127- val , _ , _ = balancerFactoriesSfg . Do ( uniqueKey , func () (interface {}, error ) {
128- b := newBalancerFactory (resolver , balancer , opts )
129- balancerFactories .Store (uniqueKey , b )
130- return b , nil
131- })
121+ val , _ , _ := balancerFactoriesSfg . CheckAndDo (uniqueKey ,
122+ func () ( any , bool ) {
123+ return balancerFactories . Load ( uniqueKey )
124+ },
125+ func () (interface {}, error ) {
126+ b := newBalancerFactory (resolver , balancer , opts )
127+ balancerFactories .Store (uniqueKey , b )
128+ return b , nil
129+ })
132130 return val .(* BalancerFactory )
133131}
134132
@@ -158,29 +156,25 @@ func renameResultCacheKey(res *discovery.Result, resolverName string) {
158156// Get create a new balancer if not exists
159157func (b * BalancerFactory ) Get (ctx context.Context , target rpcinfo.EndpointInfo ) (* Balancer , error ) {
160158 desc := b .resolver .Target (ctx , target )
161- val , ok := b .cache .Load (desc )
162- if ok {
163- return val .(* Balancer ), nil
164- }
165- val , err , _ := b .sfg .Do (desc , func () (interface {}, error ) {
166- if v , ok := b .cache .Load (desc ); ok {
167- // cache may be set already
168- return v .(* Balancer ), nil
169- }
170- res , err := b .resolver .Resolve (ctx , desc )
171- if err != nil {
172- return nil , err
173- }
174- renameResultCacheKey (& res , b .resolver .Name ())
175- bl := & Balancer {
176- b : b ,
177- target : desc ,
178- }
179- bl .res .Store (res )
180- bl .sharedTicker = getSharedTicker (bl , b .opts .RefreshInterval )
181- b .cache .Store (desc , bl )
182- return bl , nil
183- })
159+ val , err , _ := b .sfg .CheckAndDo (desc ,
160+ func () (any , bool ) {
161+ return b .cache .Load (desc )
162+ },
163+ func () (interface {}, error ) {
164+ res , err := b .resolver .Resolve (ctx , desc )
165+ if err != nil {
166+ return nil , err
167+ }
168+ renameResultCacheKey (& res , b .resolver .Name ())
169+ bl := & Balancer {
170+ b : b ,
171+ target : desc ,
172+ }
173+ bl .res .Store (res )
174+ bl .sharedTicker = getSharedTicker (bl , b .opts .RefreshInterval )
175+ b .cache .Store (desc , bl )
176+ return bl , nil
177+ })
184178 if err != nil {
185179 return nil , err
186180 }
0 commit comments