@@ -84,7 +84,7 @@ func (router *ScoreBasedRouter) routeOnce(excluded []string) (string, error) {
84
84
for be := router .backends .Back (); be != nil ; be = be .Prev () {
85
85
backend := be .Value
86
86
// These backends may be recycled, so we should not connect to them again.
87
- switch backend .status {
87
+ switch backend .Status () {
88
88
case StatusCannotConnect , StatusSchemaOutdated :
89
89
continue
90
90
}
@@ -97,7 +97,7 @@ func (router *ScoreBasedRouter) routeOnce(excluded []string) (string, error) {
97
97
}
98
98
if ! found {
99
99
backend .connScore ++
100
- router .adjustBackendList (be )
100
+ router .adjustBackendList (be , false )
101
101
return backend .addr , nil
102
102
}
103
103
}
@@ -123,29 +123,29 @@ func (router *ScoreBasedRouter) onCreateConn(addr string, conn RedirectableConn,
123
123
conn .SetEventReceiver (router )
124
124
} else {
125
125
backend .connScore --
126
- router .adjustBackendList (be )
126
+ router .adjustBackendList (be , true )
127
127
}
128
128
}
129
129
130
130
func (router * ScoreBasedRouter ) removeConn (be * glist.Element [* backendWrapper ], ce * glist.Element [* connWrapper ]) {
131
131
backend := be .Value
132
132
backend .connList .Remove (ce )
133
133
setBackendConnMetrics (backend .addr , backend .connList .Len ())
134
- router .adjustBackendList (be )
134
+ router .adjustBackendList (be , true )
135
135
}
136
136
137
137
func (router * ScoreBasedRouter ) addConn (be * glist.Element [* backendWrapper ], conn * connWrapper ) {
138
138
backend := be .Value
139
139
ce := backend .connList .PushBack (conn )
140
140
setBackendConnMetrics (backend .addr , backend .connList .Len ())
141
141
router .setConnWrapper (conn , ce )
142
- conn .NotifyBackendStatus (backend .status )
143
- router .adjustBackendList (be )
142
+ conn .NotifyBackendStatus (backend .Status () )
143
+ router .adjustBackendList (be , false )
144
144
}
145
145
146
146
// adjustBackendList moves `be` after the score of `be` changes to keep the list ordered.
147
- func (router * ScoreBasedRouter ) adjustBackendList (be * glist.Element [* backendWrapper ]) {
148
- if router .removeBackendIfEmpty (be ) {
147
+ func (router * ScoreBasedRouter ) adjustBackendList (be * glist.Element [* backendWrapper ], removeEmpty bool ) {
148
+ if removeEmpty && router .removeBackendIfEmpty (be ) {
149
149
return
150
150
}
151
151
@@ -193,7 +193,7 @@ func (router *ScoreBasedRouter) RedirectConnections() error {
193
193
if connWrapper .phase != phaseRedirectNotify {
194
194
connWrapper .phase = phaseRedirectNotify
195
195
// we dont care the results
196
- _ = connWrapper .Redirect (backend . addr )
196
+ _ = connWrapper .Redirect (backend )
197
197
}
198
198
}
199
199
}
@@ -225,14 +225,15 @@ func (router *ScoreBasedRouter) ensureBackend(addr string, forward bool) *glist.
225
225
if be == nil {
226
226
// The backend should always exist if it will be needed. Add a warning and add it back.
227
227
router .logger .Warn ("backend is not found in the router" , zap .String ("backend_addr" , addr ), zap .Stack ("stack" ))
228
- be = router .backends .PushFront (& backendWrapper {
229
- backendHealth : & backendHealth {
230
- status : StatusCannotConnect ,
231
- },
228
+ backend := & backendWrapper {
232
229
addr : addr ,
233
230
connList : glist .New [* connWrapper ](),
231
+ }
232
+ backend .setHealth (backendHealth {
233
+ status : StatusCannotConnect ,
234
234
})
235
- router .adjustBackendList (be )
235
+ be = router .backends .PushFront (backend )
236
+ router .adjustBackendList (be , false )
236
237
}
237
238
return be
238
239
}
@@ -261,9 +262,9 @@ func (router *ScoreBasedRouter) onRedirectFinished(from, to string, conn Redirec
261
262
connWrapper .phase = phaseRedirectEnd
262
263
} else {
263
264
fromBe .Value .connScore ++
264
- router .adjustBackendList (fromBe )
265
+ router .adjustBackendList (fromBe , false )
265
266
toBe .Value .connScore --
266
- router .adjustBackendList (toBe )
267
+ router .adjustBackendList (toBe , true )
267
268
connWrapper .phase = phaseRedirectFail
268
269
}
269
270
addMigrateMetrics (from , to , succeed , connWrapper .lastRedirect )
@@ -291,18 +292,19 @@ func (router *ScoreBasedRouter) OnBackendChanged(backends map[string]*backendHea
291
292
if be == nil && health .status != StatusCannotConnect {
292
293
router .logger .Info ("update backend" , zap .String ("backend_addr" , addr ),
293
294
zap .String ("prev" , "none" ), zap .String ("cur" , health .String ()))
294
- be = router .backends .PushBack (& backendWrapper {
295
- backendHealth : health ,
296
- addr : addr ,
297
- connList : glist .New [* connWrapper ](),
298
- })
299
- router .adjustBackendList (be )
295
+ backend := & backendWrapper {
296
+ addr : addr ,
297
+ connList : glist .New [* connWrapper ](),
298
+ }
299
+ backend .setHealth (* health )
300
+ be = router .backends .PushBack (backend )
301
+ router .adjustBackendList (be , false )
300
302
} else if be != nil {
301
303
backend := be .Value
302
304
router .logger .Info ("update backend" , zap .String ("backend_addr" , addr ),
303
- zap .String ("prev" , backend .String ()), zap .String ("cur" , health .String ()))
304
- backend .backendHealth = health
305
- router .adjustBackendList (be )
305
+ zap .String ("prev" , backend .mu . String ()), zap .String ("cur" , health .String ()))
306
+ backend .setHealth ( * health )
307
+ router .adjustBackendList (be , true )
306
308
for ele := backend .connList .Front (); ele != nil ; ele = ele .Next () {
307
309
conn := ele .Value
308
310
conn .NotifyBackendStatus (health .status )
@@ -371,20 +373,20 @@ func (router *ScoreBasedRouter) rebalance(maxNum int) {
371
373
zap .String ("from" , busiestBackend .addr ), zap .String ("to" , idlestBackend .addr ),
372
374
zap .Int ("from_score" , busiestBackend .score ()), zap .Int ("to_score" , idlestBackend .score ()))
373
375
busiestBackend .connScore --
374
- router .adjustBackendList (busiestEle )
376
+ router .adjustBackendList (busiestEle , true )
375
377
idlestBackend .connScore ++
376
- router .adjustBackendList (idlestEle )
378
+ router .adjustBackendList (idlestEle , false )
377
379
conn .phase = phaseRedirectNotify
378
380
conn .lastRedirect = curTime
379
- conn .Redirect (idlestBackend . addr )
381
+ conn .Redirect (idlestBackend )
380
382
}
381
383
}
382
384
383
385
func (router * ScoreBasedRouter ) removeBackendIfEmpty (be * glist.Element [* backendWrapper ]) bool {
384
386
backend := be .Value
385
387
// If connList.Len() == 0, there won't be any outgoing connections.
386
388
// And if also connScore == 0, there won't be any incoming connections.
387
- if backend .status == StatusCannotConnect && backend .connList .Len () == 0 && backend .connScore <= 0 {
389
+ if backend .Status () == StatusCannotConnect && backend .connList .Len () == 0 && backend .connScore <= 0 {
388
390
router .backends .Remove (be )
389
391
return true
390
392
}
@@ -406,9 +408,12 @@ func (router *ScoreBasedRouter) ConnCount() int {
406
408
func (router * ScoreBasedRouter ) updateServerVersion () {
407
409
for be := router .backends .Front (); be != nil ; be = be .Next () {
408
410
backend := be .Value
409
- if backend .backendHealth .status != StatusCannotConnect && len (backend .serverVersion ) > 0 {
410
- router .serverVersion = backend .serverVersion
411
- return
411
+ if backend .Status () != StatusCannotConnect {
412
+ serverVersion := backend .ServerVersion ()
413
+ if len (serverVersion ) > 0 {
414
+ router .serverVersion = serverVersion
415
+ return
416
+ }
412
417
}
413
418
}
414
419
}
0 commit comments