@@ -217,7 +217,7 @@ func (serversInfo *ServersInfo) registerRelay(name string, stamp stamps.ServerSt
217217 serversInfo .registeredRelays = append (serversInfo .registeredRelays , newRegisteredServer )
218218}
219219
220- func (serversInfo * ServersInfo ) refreshServer (proxy * Proxy , name string , stamp stamps.ServerStamp ) error {
220+ func (serversInfo * ServersInfo ) initServerInfo (proxy * Proxy , name string , stamp stamps.ServerStamp ) ( * ServerInfo , bool , error ) {
221221 serversInfo .RLock ()
222222 isNew := true
223223 for _ , oldServer := range serversInfo .inner {
@@ -229,26 +229,33 @@ func (serversInfo *ServersInfo) refreshServer(proxy *Proxy, name string, stamp s
229229 serversInfo .RUnlock ()
230230 newServer , err := fetchServerInfo (proxy , name , stamp , isNew )
231231 if err != nil {
232- return err
232+ return nil , isNew , err
233233 }
234234 if name != newServer .Name {
235235 dlog .Fatalf ("[%s] != [%s]" , name , newServer .Name )
236236 }
237237 newServer .rtt = ewma .NewMovingAverage (RTTEwmaDecay )
238238 newServer .rtt .Set (float64 (newServer .initialRtt ))
239- isNew = true
239+ return & newServer , isNew , err
240+ }
241+
242+ func (serversInfo * ServersInfo ) refreshServer (proxy * Proxy , name string , stamp stamps.ServerStamp ) error {
243+ newServer , isNew , err := serversInfo .initServerInfo (proxy , name , stamp )
244+ if err != nil {
245+ return err
246+ }
240247 serversInfo .Lock ()
241248 for i , oldServer := range serversInfo .inner {
242249 if oldServer .Name == name {
243- serversInfo .inner [i ] = & newServer
250+ serversInfo .inner [i ] = newServer
244251 isNew = false
245252 break
246253 }
247254 }
248255 serversInfo .Unlock ()
249256 if isNew {
250257 serversInfo .Lock ()
251- serversInfo .inner = append (serversInfo .inner , & newServer )
258+ serversInfo .inner = append (serversInfo .inner , newServer )
252259 serversInfo .Unlock ()
253260 proxy .serversInfo .registerServer (name , stamp )
254261 }
@@ -266,29 +273,48 @@ func (serversInfo *ServersInfo) refresh(proxy *Proxy) (int, error) {
266273 serversInfo .RUnlock ()
267274 countChannel := make (chan struct {}, proxy .certRefreshConcurrency )
268275 errorChannel := make (chan error , serversCount )
276+ serverInfoChannel := make (chan * ServerInfo , serversCount )
277+ rebuildInner := len (serversInfo .inner ) > 0
269278 for i := range registeredServers {
270279 countChannel <- struct {}{}
271280 go func (registeredServer * RegisteredServer ) {
272- err := serversInfo .refreshServer (proxy , registeredServer .name , registeredServer .stamp )
273- if err == nil {
274- proxy .xTransport .internalResolverReady = true
281+ var serverInfo * ServerInfo
282+ var err error
283+ if rebuildInner {
284+ serverInfo , _ , err = serversInfo .initServerInfo (proxy , registeredServer .name , registeredServer .stamp )
285+ serverInfoChannel <- serverInfo
286+ } else {
287+ err = serversInfo .refreshServer (proxy , registeredServer .name , registeredServer .stamp )
288+ if err == nil {
289+ proxy .xTransport .internalResolverReady = true
290+ }
275291 }
276292 errorChannel <- err
277293 <- countChannel
278294 }(& registeredServers [i ])
279295 }
280296 liveServers := 0
281297 var err error
298+ var innerRefresh []* ServerInfo
282299 for i := 0 ; i < serversCount ; i ++ {
283300 err = <- errorChannel
284301 if err == nil {
285302 liveServers ++
286303 }
304+ if rebuildInner {
305+ serverInfo := <- serverInfoChannel
306+ if serverInfo != nil {
307+ innerRefresh = append (innerRefresh , serverInfo )
308+ }
309+ }
287310 }
288311 if liveServers > 0 {
289312 err = nil
290313 }
291314 serversInfo .Lock ()
315+ if len (innerRefresh ) > 0 {
316+ serversInfo .inner = innerRefresh
317+ }
292318 sort .SliceStable (serversInfo .inner , func (i , j int ) bool {
293319 return serversInfo .inner [i ].initialRtt < serversInfo .inner [j ].initialRtt
294320 })
0 commit comments