@@ -76,35 +76,26 @@ func newRegionRequestWorker(
76
76
workerID : workerIDGen .Add (1 ),
77
77
client : client ,
78
78
store : store ,
79
- requestsCh : make (chan regionInfo , 1024 ), // 256 is an arbitrary number.
79
+ requestsCh : make (chan regionInfo , 256 ), // 256 is an arbitrary number.
80
80
81
81
requestHeader : & cdcpb.Header {ClusterId : client .clusterID , TicdcVersion : version .ReleaseSemver ()},
82
82
}
83
83
worker .requestedRegions .subscriptions = make (map [SubscriptionID ]regionFeedStates )
84
84
85
- waitForPreFetching := func () {
86
- if worker .preFetchForConnecting != nil {
87
- log .Panic ("preFetchForConnecting should be nil" ,
88
- zap .Uint64 ("workerID" , worker .workerID ),
89
- zap .Uint64 ("storeID" , store .storeID ),
90
- zap .String ("addr" , store .storeAddr ))
91
- }
92
- for regionRequest := range worker .requestsCh {
93
- if ! regionRequest .isStopped () {
94
- worker .preFetchForConnecting = & regionRequest
95
- return
96
- }
97
- }
98
- }
99
-
100
85
g .Go (func () error {
101
86
for {
87
+ // fetch for the first region request, so that can establish the grpc stream.
88
+ for regionRequest := range worker .requestsCh {
89
+ if ! regionRequest .isStopped () {
90
+ worker .preFetchForConnecting = & regionRequest
91
+ break
92
+ }
93
+ }
102
94
select {
103
95
case <- ctx .Done ():
104
96
return ctx .Err ()
105
97
default :
106
98
}
107
- waitForPreFetching ()
108
99
var regionErr error
109
100
if err := version .CheckStoreVersion (ctx , worker .client .pd , worker .store .storeID ); err != nil {
110
101
if errors .Cause (err ) == context .Canceled {
@@ -129,21 +120,15 @@ func newRegionRequestWorker(
129
120
for subID , m := range worker .clearRegionStates () {
130
121
for _ , state := range m {
131
122
state .markStopped (regionErr )
132
- regionEvent := regionEvent {
123
+ event := regionEvent {
133
124
state : state ,
134
125
worker : worker ,
135
126
}
136
- worker .client .pushRegionEventToDS (subID , regionEvent )
127
+ worker .client .pushRegionEventToDS (subID , event )
137
128
}
138
129
}
139
130
// The store may fail forever, so we need try to re-schedule all pending regions.
140
- for _ , region := range worker .clearPendingRegions () {
141
- if region .isStopped () {
142
- // It means it's a special task for stopping the table.
143
- continue
144
- }
145
- client .onRegionFail (newRegionErrorInfo (region , regionErr ))
146
- }
131
+ worker .rescheduleRegions (regionErr )
147
132
if err := util .Hang (ctx , time .Second ); err != nil {
148
133
return err
149
134
}
@@ -199,7 +184,7 @@ func (s *regionRequestWorker) run(ctx context.Context) (canceled bool) {
199
184
timer := time .After (10 * time .Second )
200
185
g .Go (func () error {
201
186
<- timer
202
- err : = errors .New ("inject force reconnect" )
187
+ err = errors .New ("inject force reconnect" )
203
188
log .Info ("inject force reconnect" , zap .Error (err ))
204
189
return err
205
190
})
@@ -341,19 +326,11 @@ func (s *regionRequestWorker) processRegionSendTask(
341
326
return nil
342
327
}
343
328
344
- fetchMoreReq := func () (regionInfo , error ) {
345
- for {
346
- var region regionInfo
347
- select {
348
- case <- ctx .Done ():
349
- return region , ctx .Err ()
350
- case region = <- s .requestsCh :
351
- return region , nil
352
- }
353
- }
354
- }
355
-
356
- region := * s .preFetchForConnecting
329
+ var (
330
+ err error
331
+ region regionInfo
332
+ )
333
+ region = * s .preFetchForConnecting
357
334
s .preFetchForConnecting = nil
358
335
for {
359
336
// TODO: can region be nil?
@@ -367,23 +344,17 @@ func (s *regionRequestWorker) processRegionSendTask(
367
344
368
345
// It means it's a special task for stopping the table.
369
346
if region .isStopped () {
370
- req := cdcpb.ChangeDataRequest {
371
- Header : s .requestHeader ,
372
- RequestId : uint64 (subID ),
373
- Request : & cdcpb.ChangeDataRequest_Deregister_ {
374
- Deregister : & cdcpb.ChangeDataRequest_Deregister {},
375
- },
376
- }
377
- if err := doSend (req ); err != nil {
347
+ req := s .newDeregisterRegionRequest (subID )
348
+ if err = doSend (req ); err != nil {
378
349
return err
379
350
}
380
351
for _ , state := range s .takeRegionStates (subID ) {
381
352
state .markStopped (& requestCancelledErr {})
382
- regionEvent := regionEvent {
353
+ event := regionEvent {
383
354
state : state ,
384
355
worker : s ,
385
356
}
386
- s .client .pushRegionEventToDS (subID , regionEvent )
357
+ s .client .pushRegionEventToDS (subID , event )
387
358
}
388
359
} else if region .subscribedSpan .stopped .Load () {
389
360
// It can be skipped directly because there must be no pending states from
@@ -395,19 +366,30 @@ func (s *regionRequestWorker) processRegionSendTask(
395
366
state .start ()
396
367
s .addRegionState (subID , region .verID .GetID (), state )
397
368
398
- if err : = doSend (s .createRegionRequest (region )); err != nil {
369
+ if err = doSend (s .newRegisterRegionRequest (region )); err != nil {
399
370
return err
400
371
}
401
372
}
402
373
403
- var err error
404
- if region , err = fetchMoreReq (); err != nil {
405
- return err
374
+ select {
375
+ case <- ctx .Done ():
376
+ return errors .Trace (ctx .Err ())
377
+ case region = <- s .requestsCh :
406
378
}
407
379
}
408
380
}
409
381
410
- func (s * regionRequestWorker ) createRegionRequest (region regionInfo ) cdcpb.ChangeDataRequest {
382
+ func (s * regionRequestWorker ) newDeregisterRegionRequest (subscriptionID SubscriptionID ) cdcpb.ChangeDataRequest {
383
+ return cdcpb.ChangeDataRequest {
384
+ Header : s .requestHeader ,
385
+ RequestId : uint64 (subscriptionID ),
386
+ Request : & cdcpb.ChangeDataRequest_Deregister_ {
387
+ Deregister : & cdcpb.ChangeDataRequest_Deregister {},
388
+ },
389
+ }
390
+ }
391
+
392
+ func (s * regionRequestWorker ) newRegisterRegionRequest (region regionInfo ) cdcpb.ChangeDataRequest {
411
393
return cdcpb.ChangeDataRequest {
412
394
Header : s .requestHeader ,
413
395
RegionId : region .verID .GetID (),
@@ -471,16 +453,20 @@ func (s *regionRequestWorker) clearRegionStates() map[SubscriptionID]regionFeedS
471
453
return subscriptions
472
454
}
473
455
474
- func (s * regionRequestWorker ) clearPendingRegions () []regionInfo {
475
- regions := make ([]regionInfo , 0 , len (s .requestsCh ))
456
+ func (s * regionRequestWorker ) rescheduleRegions (regionErr error ) {
476
457
if s .preFetchForConnecting != nil {
477
- region := * s .preFetchForConnecting
478
- s .preFetchForConnecting = nil
479
- regions = append (regions , region )
458
+ if ! s .preFetchForConnecting .isStopped () {
459
+ region := * s .preFetchForConnecting
460
+ s .preFetchForConnecting = nil
461
+ s .client .onRegionFail (newRegionErrorInfo (region , regionErr ))
462
+ }
480
463
}
481
- // TODO: do we need to start with i := 0(i := len(regions)) if s.preFetchForConnecting is nil?
482
- for i := 1 ; i < cap (regions ); i ++ {
483
- regions = append (regions , <- s .requestsCh )
464
+
465
+ for region := range s .requestsCh {
466
+ if region .isStopped () {
467
+ // It means it's a special task for stopping the table.
468
+ continue
469
+ }
470
+ s .client .onRegionFail (newRegionErrorInfo (region , regionErr ))
484
471
}
485
- return regions
486
472
}
0 commit comments