@@ -53,15 +53,23 @@ var (
5353 ScanRegionAttemptTimes = 30
5454)
5555
56+ // SpliterConfig is the config for region split.
57+ type SpliterConfig struct {
58+ GRPCMaxRecvMsgSize int
59+ SplitRegionMaxKeys int
60+ }
61+
5662// RegionSplitter is a executor of region split by rules.
5763type RegionSplitter struct {
5864 client SplitClient
65+ conf SpliterConfig
5966}
6067
6168// NewRegionSplitter returns a new RegionSplitter.
62- func NewRegionSplitter (client SplitClient ) * RegionSplitter {
69+ func NewRegionSplitter (client SplitClient , conf SpliterConfig ) * RegionSplitter {
6370 return & RegionSplitter {
6471 client : client ,
72+ conf : conf ,
6573 }
6674}
6775
@@ -122,46 +130,68 @@ SplitRegions:
122130 for _ , region := range regions {
123131 regionMap [region .Region .GetId ()] = region
124132 }
125- for regionID , keys := range splitKeyMap {
126- log .Info ("get split keys for region" , zap .Int ("len" , len (keys )), zap .Uint64 ("region" , regionID ))
127- var newRegions []* RegionInfo
128- region := regionMap [regionID ]
129- log .Info ("split regions" ,
130- logutil .Region (region .Region ), logutil .Keys (keys ), rtree .ZapRanges (ranges ))
131- newRegions , errSplit = rs .splitAndScatterRegions (ctx , region , keys )
132- if errSplit != nil {
133- if strings .Contains (errSplit .Error (), "no valid key" ) {
134- for _ , key := range keys {
135- // Region start/end keys are encoded. split_region RPC
136- // requires raw keys (without encoding).
137- log .Error ("split regions no valid key" ,
138- logutil .Key ("startKey" , region .Region .StartKey ),
139- logutil .Key ("endKey" , region .Region .EndKey ),
140- logutil .Key ("key" , codec .EncodeBytes (nil , key )),
141- rtree .ZapRanges (ranges ))
133+ for regionID , regionKeys := range splitKeyMap {
134+ log .Info ("get split keys for region" , zap .Int ("len" , len (regionKeys )), zap .Uint64 ("region" , regionID ))
135+
136+ for i := 0 ; i < len (regionKeys ); i += rs .conf .SplitRegionMaxKeys {
137+ end := i + rs .conf .SplitRegionMaxKeys
138+ if end > len (regionKeys ) {
139+ end = len (regionKeys )
140+ }
141+ keys := regionKeys [i :end ]
142+
143+ var region * RegionInfo
144+ if i == 0 {
145+ region = regionMap [regionID ]
146+ } else {
147+ encodedKey := codec .EncodeBytes (nil , keys [0 ])
148+ var errGetRegion error
149+ region , errGetRegion = rs .client .GetRegion (ctx , encodedKey )
150+ if errGetRegion != nil {
151+ time .Sleep (interval )
152+ log .Warn ("get region failed, retry" , logutil .Key ("encodedKey" , encodedKey ), zap .Error (errGetRegion ))
153+ continue SplitRegions
142154 }
143- return errors .Trace (errSplit )
144155 }
145- interval = 2 * interval
146- if interval > SplitMaxRetryInterval {
147- interval = SplitMaxRetryInterval
156+
157+ log .Info ("split regions" ,
158+ logutil .Region (region .Region ), logutil .Keys (keys ), rtree .ZapRanges (ranges ))
159+ var newRegions []* RegionInfo
160+ newRegions , errSplit = rs .splitAndScatterRegions (ctx , region , keys )
161+ if errSplit != nil {
162+ if strings .Contains (errSplit .Error (), "no valid key" ) {
163+ for _ , key := range keys {
164+ // Region start/end keys are encoded. split_region RPC
165+ // requires raw keys (without encoding).
166+ log .Error ("split regions no valid key" ,
167+ logutil .Key ("startKey" , region .Region .StartKey ),
168+ logutil .Key ("endKey" , region .Region .EndKey ),
169+ logutil .Key ("key" , codec .EncodeBytes (nil , key )),
170+ rtree .ZapRanges (ranges ))
171+ }
172+ return errors .Trace (errSplit )
173+ }
174+ interval = 2 * interval
175+ if interval > SplitMaxRetryInterval {
176+ interval = SplitMaxRetryInterval
177+ }
178+ time .Sleep (interval )
179+ log .Warn ("split regions failed, retry" ,
180+ zap .Error (errSplit ),
181+ logutil .Region (region .Region ),
182+ logutil .Leader (region .Leader ),
183+ logutil .Keys (keys ), rtree .ZapRanges (ranges ))
184+ continue SplitRegions
148185 }
149- time .Sleep (interval )
150- log .Warn ("split regions failed, retry" ,
151- zap .Error (errSplit ),
152- logutil .Region (region .Region ),
153- logutil .Leader (region .Leader ),
154- logutil .Keys (keys ), rtree .ZapRanges (ranges ))
155- continue SplitRegions
156- }
157- log .Info ("scattered regions" , zap .Int ("count" , len (newRegions )))
158- if len (newRegions ) != len (keys ) {
159- log .Warn ("split key count and new region count mismatch" ,
160- zap .Int ("new region count" , len (newRegions )),
161- zap .Int ("split key count" , len (keys )))
186+ log .Info ("scattered regions" , zap .Int ("count" , len (newRegions )))
187+ if len (newRegions ) != len (keys ) {
188+ log .Warn ("split key count and new region count mismatch" ,
189+ zap .Int ("new region count" , len (newRegions )),
190+ zap .Int ("split key count" , len (keys )))
191+ }
192+ scatterRegions = append (scatterRegions , newRegions ... )
193+ onSplit (keys )
162194 }
163- scatterRegions = append (scatterRegions , newRegions ... )
164- onSplit (keys )
165195 }
166196 break
167197 }
0 commit comments