Skip to content

Commit 5132118

Browse files
committed
add sync and change debug page to do the shuffle
1 parent c4c2c24 commit 5132118

File tree

1 file changed

+36
-13
lines changed

1 file changed

+36
-13
lines changed

go/vt/vtgateproxy/discovery.go

Lines changed: 36 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424
"math/rand"
2525
"os"
2626
"sort"
27+
"sync"
2728
"time"
2829

2930
"google.golang.org/grpc/resolver"
@@ -64,6 +65,7 @@ type JSONGateResolverBuilder struct {
6465
affinityField string
6566
affinityValue string
6667

68+
mu sync.RWMutex
6769
targets map[string][]targetHost
6870
resolvers []*JSONGateResolver
6971

@@ -83,7 +85,6 @@ type JSONGateResolver struct {
8385
target resolver.Target
8486
clientConn resolver.ClientConn
8587
poolType string
86-
affinity string
8788
}
8889

8990
var (
@@ -156,7 +157,7 @@ func (b *JSONGateResolverBuilder) start() error {
156157

157158
parseCount.Add("changed", 1)
158159

159-
log.Infof("loaded targets, pool types %v, affinity groups %v", poolTypes, affinityTypes)
160+
log.Infof("loaded targets, pool types %v, affinity %s, groups %v", poolTypes, *affinityValue, affinityTypes)
160161

161162
// Start a config watcher
162163
b.ticker = time.NewTicker(1 * time.Second)
@@ -292,17 +293,30 @@ func (b *JSONGateResolverBuilder) parse() (bool, error) {
292293
targetCount.Set(poolType, int64(len(targets[poolType])))
293294
}
294295

296+
b.mu.Lock()
295297
b.targets = targets
298+
b.mu.Unlock()
296299

297300
return true, nil
298301
}
299302

300-
// Update the current list of hosts for the given resolver
301-
func (b *JSONGateResolverBuilder) update(r *JSONGateResolver) {
302-
303-
log.V(100).Infof("resolving target %s to %d connections\n", r.target.URL.String(), *numConnections)
303+
func (b *JSONGateResolverBuilder) GetPools() []string {
304+
b.mu.RLock()
305+
defer b.mu.RUnlock()
306+
var pools []string
307+
for pool := range b.targets {
308+
pools = append(pools, pool)
309+
}
310+
sort.Strings(pools)
311+
return pools
312+
}
304313

305-
targets := b.targets[r.poolType]
314+
func (b *JSONGateResolverBuilder) GetTargets(poolType string) []targetHost {
315+
// Copy the target slice
316+
b.mu.RLock()
317+
targets := []targetHost{}
318+
targets = append(targets, b.targets[poolType]...)
319+
b.mu.RUnlock()
306320

307321
// Shuffle to ensure every host has a different order to iterate through, putting
308322
// the affinity matching (e.g. same az) hosts at the front and the non-matching ones
@@ -315,7 +329,7 @@ func (b *JSONGateResolverBuilder) update(r *JSONGateResolver) {
315329
for i := 0; i < n-1; i++ {
316330
j := head + b.rand.Intn(tail-head+1)
317331

318-
if r.affinity == "" || r.affinity == targets[j].Affinity {
332+
if *affinityField != "" && *affinityValue == targets[j].Affinity {
319333
targets[head], targets[j] = targets[j], targets[head]
320334
head++
321335
} else {
@@ -324,6 +338,16 @@ func (b *JSONGateResolverBuilder) update(r *JSONGateResolver) {
324338
}
325339
}
326340

341+
return targets
342+
}
343+
344+
// Update the current list of hosts for the given resolver
345+
func (b *JSONGateResolverBuilder) update(r *JSONGateResolver) {
346+
347+
log.V(100).Infof("resolving target %s to %d connections\n", r.target.URL.String(), *numConnections)
348+
349+
targets := b.GetTargets(r.poolType)
350+
327351
var addrs []resolver.Address
328352
for _, target := range targets {
329353
addrs = append(addrs, resolver.Address{Addr: target.Addr})
@@ -354,7 +378,6 @@ func (b *JSONGateResolverBuilder) Build(target resolver.Target, cc resolver.Clie
354378
target: target,
355379
clientConn: cc,
356380
poolType: poolType,
357-
affinity: b.affinityValue,
358381
}
359382

360383
b.update(r)
@@ -366,17 +389,17 @@ func (b *JSONGateResolverBuilder) Build(target resolver.Target, cc resolver.Clie
366389
// debugTargets will return the builder's targets with a sorted slice of
367390
// poolTypes for rendering debug output
368391
func (b *JSONGateResolverBuilder) debugTargets() any {
369-
var pools []string
392+
pools := b.GetPools()
393+
targets := map[string][]targetHost{}
370394
for pool := range b.targets {
371-
pools = append(pools, pool)
395+
targets[pool] = b.GetTargets(pool)
372396
}
373-
sort.Strings(pools)
374397
return struct {
375398
Pools []string
376399
Targets map[string][]targetHost
377400
}{
378401
Pools: pools,
379-
Targets: b.targets,
402+
Targets: targets,
380403
}
381404
}
382405

0 commit comments

Comments
 (0)