@@ -31,11 +31,11 @@ import (
31
31
"github.com/apache/rocketmq-clients/golang/v5/pkg/ticker"
32
32
"github.com/apache/rocketmq-clients/golang/v5/pkg/utils"
33
33
v2 "github.com/apache/rocketmq-clients/golang/v5/protocol/v2"
34
- "github.com/golang/protobuf/proto"
35
34
"github.com/google/uuid"
36
35
"go.uber.org/atomic"
37
36
"go.uber.org/zap"
38
37
"google.golang.org/grpc/metadata"
38
+ "google.golang.org/protobuf/proto"
39
39
)
40
40
41
41
type Client interface {
@@ -117,7 +117,7 @@ func (cs *defaultClientSession) startUp() {
117
117
if err != nil {
118
118
// we are recovering
119
119
if ! cs .recovering {
120
- cs .cli .log .Info ("Encountered error while receiving TelemetryCommand, trying to recover" )
120
+ cs .cli .log .Infof ("Encountered error while receiving TelemetryCommand, trying to recover, err=%v" , err )
121
121
// we wait five seconds to give time for the transmission error to be resolved externally before we attempt to read the message again.
122
122
time .Sleep (cs .recoveryWaitTime )
123
123
cs .recovering = true
@@ -176,13 +176,19 @@ func (cs *defaultClientSession) release() {
176
176
}
177
177
func (cs * defaultClientSession ) publish (ctx context.Context , common * v2.TelemetryCommand ) error {
178
178
var err error
179
- cs .observerLock .RLock ()
180
- if cs .observer != nil {
181
- err = cs .observer .Send (common )
182
- cs .observerLock .RUnlock ()
179
+
180
+ f0 := func () (bool , error ) {
181
+ cs .observerLock .RLock ()
182
+ defer cs .observerLock .RUnlock ()
183
+ if cs .observer != nil {
184
+ return true , cs .observer .Send (common )
185
+ }
186
+ return false , nil
187
+ }
188
+ over , err := f0 ()
189
+ if over {
183
190
return err
184
191
}
185
- cs .observerLock .RUnlock ()
186
192
187
193
cs .observerLock .Lock ()
188
194
defer cs .observerLock .Unlock ()
@@ -218,8 +224,8 @@ type defaultClient struct {
218
224
endpointsTelemetryClientTable map [string ]* defaultClientSession
219
225
endpointsTelemetryClientsLock sync.RWMutex
220
226
on atomic.Bool
221
-
222
- clientImpl isClient
227
+ inited atomic. Bool
228
+ clientImpl isClient
223
229
}
224
230
225
231
var NewClient = func (config * Config , opts ... ClientOption ) (Client , error ) {
@@ -235,6 +241,7 @@ var NewClient = func(config *Config, opts ...ClientOption) (Client, error) {
235
241
messageInterceptors : make ([]MessageInterceptor , 0 ),
236
242
endpointsTelemetryClientTable : make (map [string ]* defaultClientSession ),
237
243
on : * atomic .NewBool (true ),
244
+ inited : * atomic .NewBool (false ),
238
245
}
239
246
cli .log = sugarBaseLogger .With ("client_id" , cli .clientID )
240
247
for _ , opt := range opts {
@@ -299,7 +306,7 @@ func (cli *defaultClient) registerMessageInterceptor(messageInterceptor MessageI
299
306
cli .messageInterceptors = append (cli .messageInterceptors , messageInterceptor )
300
307
}
301
308
302
- func (cli * defaultClient ) doBefore (hookPoint MessageHookPoints , messageCommons []* MessageCommon ) {
309
+ func (cli * defaultClient ) doBefore (hookPoint MessageHookPoints , messageCommons []* MessageCommon ) error {
303
310
cli .messageInterceptorsLock .RLocker ().Lock ()
304
311
defer cli .messageInterceptorsLock .RLocker ().Unlock ()
305
312
@@ -309,9 +316,10 @@ func (cli *defaultClient) doBefore(hookPoint MessageHookPoints, messageCommons [
309
316
cli .log .Errorf ("exception raised while intercepting message, hookPoint=%v, err=%v" , hookPoint , err )
310
317
}
311
318
}
319
+ return nil
312
320
}
313
321
314
- func (cli * defaultClient ) doAfter (hookPoint MessageHookPoints , messageCommons []* MessageCommon , duration time.Duration , status MessageHookPointsStatus ) {
322
+ func (cli * defaultClient ) doAfter (hookPoint MessageHookPoints , messageCommons []* MessageCommon , duration time.Duration , status MessageHookPointsStatus ) error {
315
323
cli .messageInterceptorsLock .RLocker ().Lock ()
316
324
defer cli .messageInterceptorsLock .RLocker ().Unlock ()
317
325
@@ -321,6 +329,7 @@ func (cli *defaultClient) doAfter(hookPoint MessageHookPoints, messageCommons []
321
329
cli .log .Errorf ("exception raised while intercepting message, hookPoint=%v, err=%v" , hookPoint , err )
322
330
}
323
331
}
332
+ return nil
324
333
}
325
334
326
335
func (cli * defaultClient ) getMessageQueues (ctx context.Context , topic string ) ([]* v2.MessageQueue , error ) {
@@ -417,6 +426,36 @@ func (cli *defaultClient) getSettingsCommand() *v2.TelemetryCommand {
417
426
}
418
427
}
419
428
429
+ func (cli * defaultClient ) queryAssignments (ctx context.Context , topic string , group string , duration time.Duration ) (* []* v2.Assignment , error ) {
430
+ ctx = cli .Sign (ctx )
431
+ response , err := cli .clientManager .QueryAssignments (ctx , cli .accessPoint , cli .getQueryAssignmentRequest (topic , group ), duration )
432
+ if err != nil {
433
+ return nil , err
434
+ }
435
+ if response .GetStatus ().GetCode () != v2 .Code_OK {
436
+ return nil , & ErrRpcStatus {
437
+ Code : int32 (response .Status .GetCode ()),
438
+ Message : response .GetStatus ().GetMessage (),
439
+ }
440
+ }
441
+ ret := response .GetAssignments ()
442
+ return & ret , nil
443
+ }
444
+
445
+ func (cli * defaultClient ) getQueryAssignmentRequest (topic string , group string ) * v2.QueryAssignmentRequest {
446
+ return & v2.QueryAssignmentRequest {
447
+ Topic : & v2.Resource {
448
+ Name : topic ,
449
+ ResourceNamespace : cli .config .NameSpace ,
450
+ },
451
+ Group : & v2.Resource {
452
+ Name : group ,
453
+ ResourceNamespace : cli .config .NameSpace ,
454
+ },
455
+ Endpoints : cli .accessPoint ,
456
+ }
457
+ }
458
+
420
459
func (cli * defaultClient ) doHeartbeat (target string , request * v2.HeartbeatRequest ) error {
421
460
ctx := cli .Sign (context .Background ())
422
461
endpoints , err := utils .ParseTarget (target )
@@ -428,9 +467,6 @@ func (cli *defaultClient) doHeartbeat(target string, request *v2.HeartbeatReques
428
467
return fmt .Errorf ("failed to send heartbeat, endpoints=%v, err=%v, requestId=%s" , endpoints , err , utils .GetRequestID (ctx ))
429
468
}
430
469
if resp .Status .GetCode () != v2 .Code_OK {
431
- if resp .Status .GetCode () == v2 .Code_UNRECOGNIZED_CLIENT_TYPE {
432
- go cli .trySyncSettings ()
433
- }
434
470
cli .log .Errorf ("failed to send heartbeat, code=%v, status message=[%s], endpoints=%v, requestId=%s" , resp .Status .GetCode (), resp .Status .GetMessage (), endpoints , utils .GetRequestID (ctx ))
435
471
return & ErrRpcStatus {
436
472
Code : int32 (resp .Status .GetCode ()),
@@ -496,6 +532,7 @@ func (cli *defaultClient) startUp() error {
496
532
cm .startUp ()
497
533
cm .RegisterClient (cli )
498
534
cli .clientManager = cm
535
+
499
536
for _ , topic := range cli .initTopics {
500
537
_ , err := cli .getMessageQueues (context .Background (), topic )
501
538
if err != nil {
@@ -546,6 +583,13 @@ func (cli *defaultClient) startUp() error {
546
583
})
547
584
}
548
585
ticker .Tick (f , time .Second * 30 , cli .done )
586
+
587
+ // wait syncSettings finish
588
+ for ! cli .inited .Load () {
589
+ sugarBaseLogger .Infoln ("wait for sync settings finish" )
590
+ time .Sleep (time .Second )
591
+ }
592
+ sugarBaseLogger .Infoln ("sync settings finished" )
549
593
return nil
550
594
}
551
595
@@ -587,6 +631,10 @@ func (cli *defaultClient) GracefulStop() error {
587
631
return nil
588
632
}
589
633
634
+ func (cli * defaultClient ) isRunning () bool {
635
+ return cli .on .Load ()
636
+ }
637
+
590
638
func (cli * defaultClient ) Sign (ctx context.Context ) context.Context {
591
639
now := time .Now ().Format ("20060102T150405Z" )
592
640
return metadata .AppendToOutgoingContext (ctx ,
@@ -629,7 +677,9 @@ func (cli *defaultClient) onSettingsCommand(endpoints *v2.Endpoints, settings *v
629
677
if metric != nil {
630
678
cli .clientMeterProvider .Reset (metric )
631
679
}
632
- return cli .settings .applySettingsCommand (settings )
680
+ err := cli .settings .applySettingsCommand (settings )
681
+ cli .inited .Store (true )
682
+ return err
633
683
}
634
684
635
685
func (cli * defaultClient ) onRecoverOrphanedTransactionCommand (endpoints * v2.Endpoints , command * v2.RecoverOrphanedTransactionCommand ) {
0 commit comments