@@ -18,8 +18,10 @@ import (
1818 "crypto/rand"
1919 "fmt"
2020 "math"
21+ mrand "math/rand"
2122 "strconv"
2223 "testing"
24+ "time"
2325
2426 "github.com/pingcap/failpoint"
2527 "github.com/pingcap/kvproto/pkg/metapb"
@@ -658,6 +660,124 @@ func BenchmarkRandomRegion(b *testing.B) {
658660 }
659661}
660662
663+ func BenchmarkRandomSetRegion (b * testing.B ) {
664+ regions := NewRegionsInfo ()
665+ var items []* RegionInfo
666+ for i := 0 ; i < 1000000 ; i ++ {
667+ peer := & metapb.Peer {StoreId : 1 , Id : uint64 (i + 1 )}
668+ region := NewRegionInfo (& metapb.Region {
669+ Id : uint64 (i + 1 ),
670+ Peers : []* metapb.Peer {peer },
671+ StartKey : []byte (fmt .Sprintf ("%20d" , i )),
672+ EndKey : []byte (fmt .Sprintf ("%20d" , i + 1 )),
673+ }, peer )
674+ origin , overlaps , rangeChanged := regions .SetRegion (region )
675+ regions .UpdateSubTree (region , origin , overlaps , rangeChanged )
676+ items = append (items , region )
677+ }
678+ b .ResetTimer ()
679+ for i := 0 ; i < b .N ; i ++ {
680+ item := items [i % len (items )]
681+ item .approximateKeys = int64 (200000 )
682+ item .approximateSize = int64 (20 )
683+ origin , overlaps , rangeChanged := regions .SetRegion (item )
684+ regions .UpdateSubTree (item , origin , overlaps , rangeChanged )
685+ }
686+ }
687+
688+ func TestGetRegionSizeByRange (t * testing.T ) {
689+ regions := NewRegionsInfo ()
690+ nums := 1000010
691+ for i := 0 ; i < nums ; i ++ {
692+ peer := & metapb.Peer {StoreId : 1 , Id : uint64 (i + 1 )}
693+ endKey := []byte (fmt .Sprintf ("%20d" , i + 1 ))
694+ if i == nums - 1 {
695+ endKey = []byte ("" )
696+ }
697+ region := NewRegionInfo (& metapb.Region {
698+ Id : uint64 (i + 1 ),
699+ Peers : []* metapb.Peer {peer },
700+ StartKey : []byte (fmt .Sprintf ("%20d" , i )),
701+ EndKey : endKey ,
702+ }, peer , SetApproximateSize (10 ))
703+ origin , overlaps , rangeChanged := regions .SetRegion (region )
704+ regions .UpdateSubTree (region , origin , overlaps , rangeChanged )
705+ }
706+ totalSize := regions .GetRegionSizeByRange ([]byte ("" ), []byte ("" ))
707+ require .Equal (t , int64 (nums * 10 ), totalSize )
708+ for i := 1 ; i < 10 ; i ++ {
709+ verifyNum := nums / i
710+ endKey := fmt .Sprintf ("%20d" , verifyNum )
711+ totalSize := regions .GetRegionSizeByRange ([]byte ("" ), []byte (endKey ))
712+ require .Equal (t , int64 (verifyNum * 10 ), totalSize )
713+ }
714+ }
715+
716+ func BenchmarkRandomSetRegionWithGetRegionSizeByRange (b * testing.B ) {
717+ regions := NewRegionsInfo ()
718+ var items []* RegionInfo
719+ for i := 0 ; i < 1000000 ; i ++ {
720+ peer := & metapb.Peer {StoreId : 1 , Id : uint64 (i + 1 )}
721+ region := NewRegionInfo (& metapb.Region {
722+ Id : uint64 (i + 1 ),
723+ Peers : []* metapb.Peer {peer },
724+ StartKey : []byte (fmt .Sprintf ("%20d" , i )),
725+ EndKey : []byte (fmt .Sprintf ("%20d" , i + 1 )),
726+ }, peer , SetApproximateSize (10 ))
727+ origin , overlaps , rangeChanged := regions .SetRegion (region )
728+ regions .UpdateSubTree (region , origin , overlaps , rangeChanged )
729+ items = append (items , region )
730+ }
731+ b .ResetTimer ()
732+ go func () {
733+ for {
734+ regions .GetRegionSizeByRange ([]byte ("" ), []byte ("" ))
735+ time .Sleep (time .Millisecond )
736+ }
737+ }()
738+ for i := 0 ; i < b .N ; i ++ {
739+ item := items [i % len (items )]
740+ item .approximateKeys = int64 (200000 )
741+ origin , overlaps , rangeChanged := regions .SetRegion (item )
742+ regions .UpdateSubTree (item , origin , overlaps , rangeChanged )
743+ }
744+ }
745+
746+ func BenchmarkRandomSetRegionWithGetRegionSizeByRangeParallel (b * testing.B ) {
747+ regions := NewRegionsInfo ()
748+ var items []* RegionInfo
749+ for i := 0 ; i < 1000000 ; i ++ {
750+ peer := & metapb.Peer {StoreId : 1 , Id : uint64 (i + 1 )}
751+ region := NewRegionInfo (& metapb.Region {
752+ Id : uint64 (i + 1 ),
753+ Peers : []* metapb.Peer {peer },
754+ StartKey : []byte (fmt .Sprintf ("%20d" , i )),
755+ EndKey : []byte (fmt .Sprintf ("%20d" , i + 1 )),
756+ }, peer )
757+ origin , overlaps , rangeChanged := regions .SetRegion (region )
758+ regions .UpdateSubTree (region , origin , overlaps , rangeChanged )
759+ items = append (items , region )
760+ }
761+ b .ResetTimer ()
762+ go func () {
763+ for {
764+ regions .GetRegionSizeByRange ([]byte ("" ), []byte ("" ))
765+ time .Sleep (time .Millisecond )
766+ }
767+ }()
768+
769+ b .RunParallel (
770+ func (pb * testing.PB ) {
771+ for pb .Next () {
772+ item := items [mrand .Intn (len (items ))]
773+ n := item .Clone (SetApproximateSize (20 ))
774+ origin , overlaps , rangeChanged := regions .SetRegion (n )
775+ regions .UpdateSubTree (item , origin , overlaps , rangeChanged )
776+ }
777+ },
778+ )
779+ }
780+
661781const keyLength = 100
662782
663783func randomBytes (n int ) []byte {
0 commit comments