@@ -364,41 +364,38 @@ func (router *ScoreBasedRouter) rebalance(ctx context.Context) {
364364 }
365365 }
366366 // Migrate balanceCount connections.
367- for i := 0 ; i < count && ctx .Err () == nil ; i ++ {
368- var ce * glist.Element [* connWrapper ]
369- for ele := fromBackend .connList .Front (); ele != nil ; ele = ele .Next () {
370- conn := ele .Value
371- switch conn .phase {
372- case phaseRedirectNotify :
373- // A connection cannot be redirected again when it has not finished redirecting.
367+ i := 0
368+ for ele := fromBackend .connList .Front (); ele != nil && ctx .Err () == nil && i < count ; ele = ele .Next () {
369+ conn := ele .Value
370+ switch conn .phase {
371+ case phaseRedirectNotify :
372+ // A connection cannot be redirected again when it has not finished redirecting.
373+ continue
374+ case phaseRedirectFail :
375+ // If it failed recently, it will probably fail this time.
376+ if conn .lastRedirect .Add (redirectFailMinInterval ).After (curTime ) {
374377 continue
375- case phaseRedirectFail :
376- // If it failed recently, it will probably fail this time.
377- if conn .lastRedirect .Add (redirectFailMinInterval ).After (curTime ) {
378- continue
379- }
380378 }
381- ce = ele
382- break
383379 }
384- if ce == nil {
385- break
380+ if router .redirectConn (conn , fromBackend , toBackend , reason , logFields , curTime ) {
381+ router .lastRedirectTime = curTime
382+ i ++
386383 }
387- router .redirectConn (ce .Value , fromBackend , toBackend , reason , logFields , curTime )
388- router .lastRedirectTime = curTime
389384 }
390385}
391386
392387func (router * ScoreBasedRouter ) redirectConn (conn * connWrapper , fromBackend * backendWrapper , toBackend * backendWrapper ,
393- reason string , logFields []zap.Field , curTime time.Time ) {
388+ reason string , logFields []zap.Field , curTime time.Time ) bool {
394389 // Skip the connection if it's closing.
395- if conn .Redirect (toBackend ) {
396- fields := []zap.Field {
397- zap .Uint64 ("connID" , conn .ConnectionID ()),
398- zap .String ("from" , fromBackend .addr ),
399- zap .String ("to" , toBackend .addr ),
400- }
401- fields = append (fields , logFields ... )
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+ fields = append (fields , conn .ConnInfo ()... )
397+ succeed := conn .Redirect (toBackend )
398+ if succeed {
402399 router .logger .Debug ("begin redirect connection" , fields ... )
403400 fromBackend .connScore --
404401 router .removeBackendIfEmpty (fromBackend )
@@ -409,8 +406,10 @@ func (router *ScoreBasedRouter) redirectConn(conn *connWrapper, fromBackend *bac
409406 } else {
410407 // Avoid it to be redirected again immediately.
411408 conn .phase = phaseRedirectFail
409+ router .logger .Debug ("skip redirecting because it's closing" , fields ... )
412410 }
413411 conn .lastRedirect = curTime
412+ return succeed
414413}
415414
416415func (router * ScoreBasedRouter ) removeBackendIfEmpty (backend * backendWrapper ) bool {
0 commit comments