@@ -385,21 +385,26 @@ func (router *ScoreBasedRouter) rebalance(ctx context.Context) {
385385
386386func (router * ScoreBasedRouter ) redirectConn (conn * connWrapper , fromBackend * backendWrapper , toBackend * backendWrapper ,
387387 reason string , logFields []zap.Field , curTime time.Time ) {
388- fields := []zap.Field {
389- zap .Uint64 ("connID" , conn .ConnectionID ()),
390- zap .String ("from" , fromBackend .addr ),
391- zap .String ("to" , toBackend .addr ),
388+ // Skip the connection if it's closing.
389+ if conn .Redirect (toBackend ) {
390+ fields := []zap.Field {
391+ zap .Uint64 ("connID" , conn .ConnectionID ()),
392+ zap .String ("from" , fromBackend .addr ),
393+ zap .String ("to" , toBackend .addr ),
394+ }
395+ fields = append (fields , logFields ... )
396+ router .logger .Debug ("begin redirect connection" , fields ... )
397+ fromBackend .connScore --
398+ router .removeBackendIfEmpty (fromBackend )
399+ toBackend .connScore ++
400+ conn .phase = phaseRedirectNotify
401+ conn .redirectReason = reason
402+ conn .redirectingBackend = toBackend
403+ } else {
404+ // Avoid it to be redirected again immediately.
405+ conn .phase = phaseRedirectFail
392406 }
393- fields = append (fields , logFields ... )
394- router .logger .Debug ("begin redirect connection" , fields ... )
395- fromBackend .connScore --
396- router .removeBackendIfEmpty (fromBackend )
397- toBackend .connScore ++
398- conn .phase = phaseRedirectNotify
399- conn .redirectReason = reason
400407 conn .lastRedirect = curTime
401- conn .Redirect (toBackend )
402- conn .redirectingBackend = toBackend
403408}
404409
405410func (router * ScoreBasedRouter ) removeBackendIfEmpty (backend * backendWrapper ) bool {
0 commit comments