@@ -29,6 +29,7 @@ import (
29
29
"github.com/pingcap/parser/mysql"
30
30
"github.com/pingcap/tidb/kv"
31
31
"github.com/pingcap/tidb/sessionctx"
32
+ "github.com/pingcap/tidb/store/helper"
32
33
"github.com/pingcap/tidb/store/tikv"
33
34
"github.com/pingcap/tidb/table/tables"
34
35
"github.com/pingcap/tidb/tablecodec"
@@ -439,12 +440,16 @@ func (e *SplitTableRegionExec) getSplitTableKeys() ([][]byte, error) {
439
440
440
441
// RegionMeta contains a region's peer detail
441
442
type regionMeta struct {
442
- region * metapb.Region
443
- leaderID uint64
444
- storeID uint64 // storeID is the store ID of the leader region.
445
- start string
446
- end string
447
- scattering bool
443
+ region * metapb.Region
444
+ leaderID uint64
445
+ storeID uint64 // storeID is the store ID of the leader region.
446
+ start string
447
+ end string
448
+ scattering bool
449
+ writtenBytes int64
450
+ readBytes int64
451
+ approximateSize int64
452
+ approximateKeys int64
448
453
}
449
454
450
455
func getPhysicalTableRegions (physicalTableID int64 , tableInfo * model.TableInfo , tikvStore tikv.Storage , s kv.SplitableStore , uniqueRegionMap map [uint64 ]struct {}) ([]regionMeta , error ) {
@@ -460,7 +465,7 @@ func getPhysicalTableRegions(physicalTableID int64, tableInfo *model.TableInfo,
460
465
}
461
466
recordPrefix := tablecodec .GenTableRecordPrefix (physicalTableID )
462
467
tablePrefix := tablecodec .GenTablePrefix (physicalTableID )
463
- recordRegions , err := getRegionMeta (recordRegionMetas , uniqueRegionMap , tablePrefix , recordPrefix , nil , physicalTableID , 0 )
468
+ recordRegions , err := getRegionMeta (tikvStore , recordRegionMetas , uniqueRegionMap , tablePrefix , recordPrefix , nil , physicalTableID , 0 )
464
469
if err != nil {
465
470
return nil , err
466
471
}
@@ -477,7 +482,7 @@ func getPhysicalTableRegions(physicalTableID int64, tableInfo *model.TableInfo,
477
482
return nil , err
478
483
}
479
484
indexPrefix := tablecodec .EncodeTableIndexPrefix (physicalTableID , index .ID )
480
- indexRegions , err := getRegionMeta (regionMetas , uniqueRegionMap , tablePrefix , recordPrefix , indexPrefix , physicalTableID , index .ID )
485
+ indexRegions , err := getRegionMeta (tikvStore , regionMetas , uniqueRegionMap , tablePrefix , recordPrefix , indexPrefix , physicalTableID , index .ID )
481
486
if err != nil {
482
487
return nil , err
483
488
}
@@ -504,7 +509,7 @@ func getPhysicalIndexRegions(physicalTableID int64, indexInfo *model.IndexInfo,
504
509
recordPrefix := tablecodec .GenTableRecordPrefix (physicalTableID )
505
510
tablePrefix := tablecodec .GenTablePrefix (physicalTableID )
506
511
indexPrefix := tablecodec .EncodeTableIndexPrefix (physicalTableID , indexInfo .ID )
507
- indexRegions , err := getRegionMeta (regions , uniqueRegionMap , tablePrefix , recordPrefix , indexPrefix , physicalTableID , indexInfo .ID )
512
+ indexRegions , err := getRegionMeta (tikvStore , regions , uniqueRegionMap , tablePrefix , recordPrefix , indexPrefix , physicalTableID , indexInfo .ID )
508
513
if err != nil {
509
514
return nil , err
510
515
}
@@ -585,7 +590,7 @@ func (d *regionKeyDecoder) decodeRegionKey(key []byte) string {
585
590
return fmt .Sprintf ("%x" , key )
586
591
}
587
592
588
- func getRegionMeta (regionMetas []* tikv.Region , uniqueRegionMap map [uint64 ]struct {}, tablePrefix , recordPrefix , indexPrefix []byte , physicalTableID , indexID int64 ) ([]regionMeta , error ) {
593
+ func getRegionMeta (tikvStore tikv. Storage , regionMetas []* tikv.Region , uniqueRegionMap map [uint64 ]struct {}, tablePrefix , recordPrefix , indexPrefix []byte , physicalTableID , indexID int64 ) ([]regionMeta , error ) {
589
594
regions := make ([]regionMeta , 0 , len (regionMetas ))
590
595
for _ , r := range regionMetas {
591
596
if _ , ok := uniqueRegionMap [r .GetID ()]; ok {
@@ -598,6 +603,37 @@ func getRegionMeta(regionMetas []*tikv.Region, uniqueRegionMap map[uint64]struct
598
603
storeID : r .GetLeaderStoreID (),
599
604
})
600
605
}
606
+ regions , err := getRegionInfo (tikvStore , regions )
607
+ if err != nil {
608
+ return regions , err
609
+ }
601
610
decodeRegionsKey (regions , tablePrefix , recordPrefix , indexPrefix , physicalTableID , indexID )
602
611
return regions , nil
603
612
}
613
+
614
+ func getRegionInfo (store tikv.Storage , regions []regionMeta ) ([]regionMeta , error ) {
615
+ // check pd server exists.
616
+ etcd , ok := store .(tikv.EtcdBackend )
617
+ if ! ok {
618
+ return regions , nil
619
+ }
620
+ pdHosts := etcd .EtcdAddrs ()
621
+ if len (pdHosts ) == 0 {
622
+ return regions , nil
623
+ }
624
+ tikvHelper := & helper.Helper {
625
+ Store : store ,
626
+ RegionCache : store .GetRegionCache (),
627
+ }
628
+ for i := range regions {
629
+ regionInfo , err := tikvHelper .GetRegionInfoByID (regions [i ].region .Id )
630
+ if err != nil {
631
+ return nil , err
632
+ }
633
+ regions [i ].writtenBytes = regionInfo .WrittenBytes
634
+ regions [i ].readBytes = regionInfo .ReadBytes
635
+ regions [i ].approximateSize = regionInfo .ApproximateSize
636
+ regions [i ].approximateKeys = regionInfo .ApproximateKeys
637
+ }
638
+ return regions , nil
639
+ }
0 commit comments