mirror of
https://github.com/geektutu/7days-golang.git
synced 2024-04-21 12:32:11 +00:00
gee-rpc/day7 use d.index to mode n to ensure safety
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user