@@ -90,7 +90,7 @@ type Client interface {
90
90
GetCallOption () []CallOption
91
91
GetBackoff () backoff.Backoff
92
92
SetDisableResolveDNSAddr (addr string , disabled bool )
93
- ConnectedAddrs () []string
93
+ ConnectedAddrs (context. Context ) []string
94
94
Close (ctx context.Context ) error
95
95
}
96
96
@@ -249,7 +249,7 @@ func (g *gRPCClient) StartConnectionMonitor(ctx context.Context) (<-chan error,
249
249
return ctx .Err ()
250
250
case <- prTick .C :
251
251
if g .enablePoolRebalance {
252
- err = g .rangeConns (func (addr string , p pool.Conn ) bool {
252
+ err = g .rangeConns (ctx , func (addr string , p pool.Conn ) bool {
253
253
// if addr or pool is nil or empty the registration of conns is invalid let's disconnect them
254
254
if addr == "" || p == nil {
255
255
disconnectTargets = append (disconnectTargets , addr )
@@ -286,7 +286,7 @@ func (g *gRPCClient) StartConnectionMonitor(ctx context.Context) (<-chan error,
286
286
})
287
287
}
288
288
case <- hcTick .C :
289
- err = g .rangeConns (func (addr string , p pool.Conn ) bool {
289
+ err = g .rangeConns (ctx , func (addr string , p pool.Conn ) bool {
290
290
// if addr or pool is nil or empty the registration of conns is invalid let's disconnect them
291
291
if addr == "" || p == nil {
292
292
disconnectTargets = append (disconnectTargets , addr )
@@ -415,7 +415,7 @@ func (g *gRPCClient) Range(
415
415
if g .conns .Len () == 0 {
416
416
return errors .ErrGRPCClientConnNotFound ("*" )
417
417
}
418
- err = g .rangeConns (func (addr string , p pool.Conn ) bool {
418
+ err = g .rangeConns (ctx , func (addr string , p pool.Conn ) bool {
419
419
ssctx , sspan := trace .StartSpan (sctx , apiName + "/Client.Range/" + addr )
420
420
defer func () {
421
421
if sspan != nil {
@@ -478,7 +478,7 @@ func (g *gRPCClient) RangeConcurrent(
478
478
if g .conns .Len () == 0 {
479
479
return errors .ErrGRPCClientConnNotFound ("*" )
480
480
}
481
- err = g .rangeConns (func (addr string , p pool.Conn ) bool {
481
+ err = g .rangeConns (ctx , func (addr string , p pool.Conn ) bool {
482
482
eg .Go (safety .RecoverFunc (func () (err error ) {
483
483
ssctx , sspan := trace .StartSpan (egctx , apiName + "/Client.RangeConcurrent/" + addr )
484
484
defer func () {
@@ -565,7 +565,7 @@ func (g *gRPCClient) OrderedRange(
565
565
return nil
566
566
default :
567
567
p , ok := g .conns .Load (addr )
568
- if ! ok || p == nil {
568
+ if ! ok || p == nil || ! p . IsHealthy ( sctx ) {
569
569
g .crl .Store (addr , true )
570
570
log .Warnf ("gRPCClient.OrderedRange operation failed, gRPC connection pool for %s is invalid,\t error: %v" , addr , errors .ErrGRPCClientConnNotFound (addr ))
571
571
continue
@@ -634,7 +634,7 @@ func (g *gRPCClient) OrderedRangeConcurrent(
634
634
addr := order
635
635
eg .Go (safety .RecoverFunc (func () (err error ) {
636
636
p , ok := g .conns .Load (addr )
637
- if ! ok || p == nil {
637
+ if ! ok || p == nil || ! p . IsHealthy ( sctx ) {
638
638
g .crl .Store (addr , true )
639
639
log .Warnf ("gRPCClient.OrderedRangeConcurrent operation failed, gRPC connection pool for %s is invalid,\t error: %v" , addr , errors .ErrGRPCClientConnNotFound (addr ))
640
640
return nil
@@ -701,7 +701,7 @@ func (g *gRPCClient) RoundRobin(
701
701
}
702
702
703
703
do := func () (data any , err error ) {
704
- cerr := g .rangeConns (func (addr string , p pool.Conn ) bool {
704
+ cerr := g .rangeConns (ctx , func (addr string , p pool.Conn ) bool {
705
705
select {
706
706
case <- ctx .Done ():
707
707
err = ctx .Err ()
@@ -879,14 +879,14 @@ func (g *gRPCClient) connectWithBackoff(
879
879
errors .Is (err , context .DeadlineExceeded ) {
880
880
return nil , false , err
881
881
}
882
- return nil , err != nil , err
882
+ return nil , p . IsHealthy ( ctx ) , err
883
883
}
884
884
status .Log (st .Code (), err )
885
885
switch st .Code () {
886
886
case codes .Internal ,
887
887
codes .Unavailable ,
888
888
codes .ResourceExhausted :
889
- return nil , err != nil , err
889
+ return nil , p . IsHealthy ( ctx ) , err
890
890
}
891
891
return nil , false , err
892
892
}
@@ -1066,7 +1066,7 @@ func (g *gRPCClient) Disconnect(ctx context.Context, addr string) error {
1066
1066
atomic .AddUint64 (& g .clientCount , ^ uint64 (0 ))
1067
1067
if p != nil {
1068
1068
log .Debugf ("gRPC client connection pool addr = %s will disconnect soon..." , addr )
1069
- return nil , p .Disconnect ()
1069
+ return nil , p .Disconnect (ctx )
1070
1070
}
1071
1071
return nil , nil
1072
1072
})
@@ -1085,10 +1085,10 @@ func (g *gRPCClient) Disconnect(ctx context.Context, addr string) error {
1085
1085
return nil
1086
1086
}
1087
1087
1088
- func (g * gRPCClient ) ConnectedAddrs () (addrs []string ) {
1088
+ func (g * gRPCClient ) ConnectedAddrs (ctx context. Context ) (addrs []string ) {
1089
1089
addrs = make ([]string , 0 , g .conns .Len ())
1090
- err := g .rangeConns (func (addr string , p pool.Conn ) bool {
1091
- if p != nil && p .IsHealthy (context . Background () ) {
1090
+ err := g .rangeConns (ctx , func (addr string , p pool.Conn ) bool {
1091
+ if p != nil && p .IsHealthy (ctx ) {
1092
1092
addrs = append (addrs , addr )
1093
1093
}
1094
1094
return true
@@ -1104,18 +1104,34 @@ func (g *gRPCClient) Close(ctx context.Context) (err error) {
1104
1104
g .stopMonitor ()
1105
1105
}
1106
1106
g .conns .Range (func (addr string , p pool.Conn ) bool {
1107
- derr := g .Disconnect (ctx , addr )
1108
- if derr != nil && ! errors .Is (derr , errors .ErrGRPCClientConnNotFound (addr )) {
1109
- err = errors .Join (err , derr )
1107
+ select {
1108
+ case <- ctx .Done ():
1109
+ return false
1110
+ default :
1111
+ derr := g .Disconnect (ctx , addr )
1112
+ if derr != nil && ! errors .Is (derr , errors .ErrGRPCClientConnNotFound (addr )) {
1113
+ err = errors .Join (err , derr )
1114
+ }
1115
+ return true
1110
1116
}
1111
- return true
1112
1117
})
1113
1118
return err
1114
1119
}
1115
1120
1116
- func (g * gRPCClient ) rangeConns (fn func (addr string , p pool.Conn ) bool ) error {
1121
+ func (g * gRPCClient ) rangeConns (ctx context. Context , fn func (addr string , p pool.Conn ) bool ) error {
1117
1122
var cnt int
1118
1123
g .conns .Range (func (addr string , p pool.Conn ) bool {
1124
+ if p == nil || ! p .IsHealthy (ctx ) {
1125
+ pc , err := p .Connect (ctx )
1126
+ if pc == nil || err != nil || ! pc .IsHealthy (ctx ) {
1127
+ if pc != nil {
1128
+ pc .Disconnect (ctx )
1129
+ }
1130
+ log .Debugf ("Unhealthy connection detected for %s during gRPC Connection Range over Loop:\t %s" , addr , p .String ())
1131
+ return true
1132
+ }
1133
+ p = pc
1134
+ }
1119
1135
cnt ++
1120
1136
return fn (addr , p )
1121
1137
})
0 commit comments