gee-rpc/day7 use d.index to mode n to ensure safety

This commit is contained in:
gzdaijie
2020-10-06 19:38:27 +08:00
parent 57e28814cc
commit b5646b692b
2 changed files with 7 additions and 4 deletions
@@ -3,6 +3,7 @@ package registy
import (
"log"
"net/http"
"sort"
"strings"
"sync"
"time"
@@ -54,6 +55,7 @@ func (r *Registry) aliveServers() []string {
delete(r.servers, addr)
}
}
sort.Strings(alive)
return alive
}
+5 -4
View File
@@ -49,15 +49,16 @@ func (d *MultiServersDiscovery) Update(servers []string) error {
func (d *MultiServersDiscovery) Get(mode SelectMode) (string, error) {
d.mu.Lock()
defer d.mu.Unlock()
if len(d.servers) == 0 {
n := len(d.servers)
if n == 0 {
return "", errors.New("rpc discovery: no available servers")
}
switch mode {
case RandomSelect:
return d.servers[d.r.Intn(len(d.servers))], nil
return d.servers[d.r.Intn(n)], nil
case RoundRobinSelect:
s := d.servers[d.index]
d.index = (d.index + 1) % len(d.servers)
s := d.servers[d.index%n] // servers could be updated, so mode n to ensure safety
d.index = (d.index + 1) % n
return s, nil
default:
return "", errors.New("rpc discovery: not supported select mode")