@@ -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 () {
@@ -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 ()
@@ -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