fix: strategyRoundRobin not begin with zero

This commit is contained in:
gVisor bot 2023-03-10 12:47:01 +08:00
parent 8521485872
commit 5ea4f0ed0b

View file

@ -131,21 +131,23 @@ func strategyRoundRobin() strategyFn {
idx := 0 idx := 0
idxMutex := sync.Mutex{} idxMutex := sync.Mutex{}
return func(proxies []C.Proxy, metadata *C.Metadata, touch bool) C.Proxy { return func(proxies []C.Proxy, metadata *C.Metadata, touch bool) C.Proxy {
id := idx // value could be wrong due to no lock, but don't care if we don't touch idxMutex.Lock()
defer idxMutex.Unlock()
i := 0
length := len(proxies)
if touch { if touch {
idxMutex.Lock()
defer idxMutex.Unlock()
id = idx // get again by lock's protect, so it must be right
defer func() { defer func() {
idx = id idx = (idx + i) % length
}() }()
} }
length := len(proxies) for ; i < length; i++ {
for i := 0; i < length; i++ { id := (idx + i) % length
id = (id + 1) % length
proxy := proxies[id] proxy := proxies[id]
if proxy.Alive() { if proxy.Alive() {
i++
return proxy return proxy
} }
} }