Skip to content

Commit 54d59fb

Browse files
committed
Create completely new ServersInfo.inner when refresh()
Exclude servers/relays that have been removed from the sources, had their privacy level lowered, or IPv6 has became unavailable while enabled IPv6 servers.
1 parent 7cdbc70 commit 54d59fb

File tree

1 file changed

+34
-8
lines changed

1 file changed

+34
-8
lines changed

dnscrypt-proxy/serversInfo.go

Lines changed: 34 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)