@@ -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,7 +879,7 @@ 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 , err != nil && p . IsHealthy ( ctx ) , err
883
883
}
884
884
status .Log (st .Code (), err )
885
885
switch st .Code () {
@@ -1087,8 +1087,9 @@ func (g *gRPCClient) Disconnect(ctx context.Context, addr string) error {
1087
1087
1088
1088
func (g * gRPCClient ) ConnectedAddrs () (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
+ ctx := context .Background ()
1091
+ err := g .rangeConns (ctx , func (addr string , p pool.Conn ) bool {
1092
+ if p != nil && p .IsHealthy (ctx ) {
1092
1093
addrs = append (addrs , addr )
1093
1094
}
1094
1095
return true
@@ -1113,9 +1114,20 @@ func (g *gRPCClient) Close(ctx context.Context) (err error) {
1113
1114
return err
1114
1115
}
1115
1116
1116
- func (g * gRPCClient ) rangeConns (fn func (addr string , p pool.Conn ) bool ) error {
1117
+ func (g * gRPCClient ) rangeConns (ctx context. Context , fn func (addr string , p pool.Conn ) bool ) error {
1117
1118
var cnt int
1118
1119
g .conns .Range (func (addr string , p pool.Conn ) bool {
1120
+ if p == nil || ! p .IsHealthy (ctx ) {
1121
+ pc , err := p .Connect (ctx )
1122
+ if pc == nil || err != nil || ! pc .IsHealthy (ctx ) {
1123
+ if pc != nil {
1124
+ pc .Disconnect ()
1125
+ }
1126
+ log .Debugf ("Unhealthy connection detected for %s during gRPC Connection Range over Loop:\t %s" , addr , p .String ())
1127
+ return true
1128
+ }
1129
+ p = pc
1130
+ }
1119
1131
cnt ++
1120
1132
return fn (addr , p )
1121
1133
})
0 commit comments