@@ -22,9 +22,10 @@ type BalancerImpl struct {
22
22
coordinatorConn * grpc.ClientConn
23
23
threshold []float64
24
24
25
- keyRanges []* kr.KeyRange
26
- krIdx map [string ]int
27
- shardKr map [string ][]int
25
+ dsToKeyRanges map [string ][]* kr.KeyRange
26
+ dsToKrIdx map [string ]map [string ]int
27
+ shardKr map [string ][]string
28
+ krToDs map [string ]string
28
29
}
29
30
30
31
func NewBalancer () (* BalancerImpl , error ) {
@@ -41,9 +42,10 @@ func NewBalancer() (*BalancerImpl, error) {
41
42
return & BalancerImpl {
42
43
coordinatorConn : conn ,
43
44
threshold : threshold ,
44
- keyRanges : []* kr.KeyRange {},
45
- krIdx : map [string ]int {},
46
- shardKr : map [string ][]int {},
45
+ dsToKeyRanges : map [string ][]* kr.KeyRange {},
46
+ dsToKrIdx : map [string ]map [string ]int {},
47
+ shardKr : map [string ][]string {},
48
+ krToDs : map [string ]string {},
47
49
}, nil
48
50
}
49
51
@@ -252,7 +254,7 @@ func (b *BalancerImpl) getStatsByKeyRange(ctx context.Context, shard *ShardMetri
252
254
if err = rows .Scan (& krId , & cpu ); err != nil {
253
255
return err
254
256
}
255
- if _ , ok := b .krIdx [krId ]; ! ok {
257
+ if _ , ok := b .krToDs [krId ]; ! ok {
256
258
continue
257
259
}
258
260
if _ , ok := shard .MetricsKR [krId ]; ! ok {
@@ -267,8 +269,10 @@ func (b *BalancerImpl) getStatsByKeyRange(ctx context.Context, shard *ShardMetri
267
269
return err
268
270
}
269
271
270
- for _ , i := range b .shardKr [shard .ShardId ] {
271
- krg := b .keyRanges [i ]
272
+ for _ , krId := range b .shardKr [shard .ShardId ] {
273
+ ds := b .krToDs [krId ]
274
+ i := b.dsToKrIdx [ds ][krId ]
275
+ krg := b.dsToKeyRanges [ds ][i ]
272
276
if krg .ShardID != shard .ShardId {
273
277
continue
274
278
}
@@ -284,8 +288,8 @@ func (b *BalancerImpl) getStatsByKeyRange(ctx context.Context, shard *ShardMetri
284
288
WHERE %s;
285
289
`
286
290
var nextKR * kr.KeyRange
287
- if i < len (b .keyRanges )- 1 {
288
- nextKR = b .keyRanges [i + 1 ]
291
+ if i < len (b .dsToKeyRanges [ ds ] )- 1 {
292
+ nextKR = b .dsToKeyRanges [ ds ] [i + 1 ]
289
293
}
290
294
condition , err := b .getKRCondition (rel , krg , nextKR , "t" )
291
295
if err != nil {
@@ -417,15 +421,16 @@ func (b *BalancerImpl) maxFitOnShard(krMetrics []float64, krKeyCount int64, shar
417
421
418
422
func (b * BalancerImpl ) getAdjacentShards (krId string ) map [string ]struct {} {
419
423
res := make (map [string ]struct {}, 0 )
420
- krIdx := b .krIdx [krId ]
424
+ ds := b .krToDs [krId ]
425
+ krIdx := b.dsToKrIdx [ds ][krId ]
421
426
if krIdx != 0 {
422
- res [b .keyRanges [krIdx - 1 ].ShardID ] = struct {}{}
427
+ res [b .dsToKeyRanges [ ds ] [krIdx - 1 ].ShardID ] = struct {}{}
423
428
}
424
- if krIdx < len (b .keyRanges )- 1 {
425
- res [b .keyRanges [krIdx + 1 ].ShardID ] = struct {}{}
429
+ if krIdx < len (b .dsToKeyRanges )- 1 {
430
+ res [b .dsToKeyRanges [ ds ] [krIdx + 1 ].ShardID ] = struct {}{}
426
431
}
427
432
// do not include current shard
428
- delete (res , b .keyRanges [krIdx ].ShardID )
433
+ delete (res , b.dsToKeyRanges [ ds ] [krIdx ].ShardID )
429
434
return res
430
435
}
431
436
@@ -463,14 +468,18 @@ func (b *BalancerImpl) getTasks(ctx context.Context, shardFrom *ShardMetrics, kr
463
468
Int ("key_count" , keyCount ).
464
469
Msg ("generating move tasks" )
465
470
// Move from beginning or the end of key range
466
- krInd := b .krIdx [krId ]
471
+ if _ , ok := b .krToDs [krId ]; ! ok {
472
+ return nil , fmt .Errorf ("unknown key range id \" %s\" " , krId )
473
+ }
474
+ ds := b .krToDs [krId ]
475
+ krInd := b.dsToKrIdx [ds ][krId ]
467
476
krIdTo := ""
468
477
var join tasks.JoinType = tasks .JoinNone
469
- if krInd < len (b .keyRanges )- 1 && b .keyRanges [krInd + 1 ].ShardID == shardToId {
470
- krIdTo = b .keyRanges [krInd + 1 ].ID
478
+ if krInd < len (b .dsToKeyRanges [ ds ] )- 1 && b .dsToKeyRanges [ ds ] [krInd + 1 ].ShardID == shardToId {
479
+ krIdTo = b .dsToKeyRanges [ ds ] [krInd + 1 ].ID
471
480
join = tasks .JoinRight
472
- } else if krInd > 0 && b .keyRanges [krInd - 1 ].ShardID == shardToId {
473
- krIdTo = b .keyRanges [krInd - 1 ].ID
481
+ } else if krInd > 0 && b .dsToKeyRanges [ ds ] [krInd - 1 ].ShardID == shardToId {
482
+ krIdTo = b .dsToKeyRanges [ ds ] [krInd - 1 ].ID
474
483
join = tasks .JoinLeft
475
484
}
476
485
@@ -491,11 +500,8 @@ func (b *BalancerImpl) getTasks(ctx context.Context, shardFrom *ShardMetrics, kr
491
500
maxCount = count
492
501
}
493
502
}
494
- if _ , ok := b .krIdx [krId ]; ! ok {
495
- return nil , fmt .Errorf ("unknown key range id \" %s\" " , krId )
496
- }
497
503
var rel * distributions.DistributedRelation = nil
498
- allRels , err := b .getKRRelations (ctx , b.keyRanges [b. krIdx [ krId ] ])
504
+ allRels , err := b .getKRRelations (ctx , b.dsToKeyRanges [ ds ][ krInd ])
499
505
if err != nil {
500
506
return nil , err
501
507
}
@@ -664,22 +670,35 @@ func (b *BalancerImpl) updateKeyRanges(ctx context.Context) error {
664
670
if err != nil {
665
671
return err
666
672
}
667
- keyRanges := make ([]* kr.KeyRange , len (keyRangesProto .KeyRangesInfo ))
668
- for i , krProto := range keyRangesProto .KeyRangesInfo {
669
- keyRanges [i ] = kr .KeyRangeFromProto (krProto )
673
+ keyRanges := make (map [string ][]* kr.KeyRange )
674
+ for _ , krProto := range keyRangesProto .KeyRangesInfo {
675
+ if _ , ok := keyRanges [krProto .DistributionId ]; ! ok {
676
+ keyRanges [krProto .DistributionId ] = make ([]* kr.KeyRange , 0 )
677
+ }
678
+ keyRanges [krProto .DistributionId ] = append (keyRanges [krProto .DistributionId ], kr .KeyRangeFromProto (krProto ))
670
679
}
671
- sort .Slice (keyRanges , func (i , j int ) bool {
672
- return kr .CmpRangesLess (keyRanges [i ].LowerBound , keyRanges [j ].LowerBound )
673
- })
674
- b .keyRanges = keyRanges
675
- b .krIdx = make (map [string ]int )
676
- b .shardKr = make (map [string ][]int )
677
- for i , krg := range b .keyRanges {
678
- b .krIdx [krg .ID ] = i
679
- if _ , ok := b .shardKr [krg .ShardID ]; ! ok {
680
- b .shardKr [krg .ShardID ] = make ([]int , 0 )
681
- }
682
- b .shardKr [krg .ShardID ] = append (b .shardKr [krg .ShardID ], i )
680
+ for _ , krs := range keyRanges {
681
+ sort .Slice (krs , func (i , j int ) bool {
682
+ return kr .CmpRangesLess (krs [i ].LowerBound , krs [j ].LowerBound )
683
+ })
684
+ }
685
+
686
+ b .dsToKeyRanges = keyRanges
687
+ b .dsToKrIdx = make (map [string ]map [string ]int )
688
+ b .shardKr = make (map [string ][]string )
689
+ b .krToDs = make (map [string ]string )
690
+ for ds , krs := range b .dsToKeyRanges {
691
+ for i , krg := range krs {
692
+ b .krToDs [krg .ID ] = ds
693
+ if _ , ok := b .dsToKrIdx [ds ]; ! ok {
694
+ b .dsToKrIdx [ds ] = make (map [string ]int )
695
+ }
696
+ b.dsToKrIdx [ds ][krg.ID ] = i
697
+ if _ , ok := b .shardKr [krg .ShardID ]; ! ok {
698
+ b .shardKr [krg .ShardID ] = make ([]string , 0 )
699
+ }
700
+ b .shardKr [krg .ShardID ] = append (b .shardKr [krg .ShardID ], krg .ID )
701
+ }
683
702
}
684
703
685
704
return nil
0 commit comments