fix lock usage in server list

pull/298/merge
Darien Raymond 2017-04-25 23:40:25 +02:00
parent fb3d2ca862
commit 0d92dce5eb
No known key found for this signature in database
GPG Key ID: 7251FFA14BB18169
2 changed files with 28 additions and 29 deletions

View File

@ -13,32 +13,32 @@ func NewServerList() *ServerList {
return &ServerList{}
}
func (v *ServerList) AddServer(server *ServerSpec) {
v.Lock()
defer v.Unlock()
func (sl *ServerList) AddServer(server *ServerSpec) {
sl.Lock()
defer sl.Unlock()
v.servers = append(v.servers, server)
sl.servers = append(sl.servers, server)
}
func (v *ServerList) Size() uint32 {
v.RLock()
defer v.RUnlock()
func (sl *ServerList) Size() uint32 {
sl.RLock()
defer sl.RUnlock()
return uint32(len(v.servers))
return uint32(len(sl.servers))
}
func (v *ServerList) GetServer(idx uint32) *ServerSpec {
v.RLock()
defer v.RUnlock()
func (sl *ServerList) GetServer(idx uint32) *ServerSpec {
sl.Lock()
defer sl.Unlock()
for {
if idx >= uint32(len(v.servers)) {
if idx >= uint32(len(sl.servers)) {
return nil
}
server := v.servers[idx]
server := sl.servers[idx]
if !server.IsValid() {
v.RemoveServer(idx)
sl.removeServer(idx)
continue
}
@ -46,11 +46,10 @@ func (v *ServerList) GetServer(idx uint32) *ServerSpec {
}
}
// Private: Visible for testing.
func (v *ServerList) RemoveServer(idx uint32) {
n := len(v.servers)
v.servers[idx] = v.servers[n-1]
v.servers = v.servers[:n-1]
func (sl *ServerList) removeServer(idx uint32) {
n := len(sl.servers)
sl.servers[idx] = sl.servers[n-1]
sl.servers = sl.servers[:n-1]
}
type ServerPicker interface {
@ -70,21 +69,21 @@ func NewRoundRobinServerPicker(serverlist *ServerList) *RoundRobinServerPicker {
}
}
func (v *RoundRobinServerPicker) PickServer() *ServerSpec {
v.Lock()
defer v.Unlock()
func (p *RoundRobinServerPicker) PickServer() *ServerSpec {
p.Lock()
defer p.Unlock()
next := v.nextIndex
server := v.serverlist.GetServer(next)
next := p.nextIndex
server := p.serverlist.GetServer(next)
if server == nil {
next = 0
server = v.serverlist.GetServer(0)
server = p.serverlist.GetServer(0)
}
next++
if next >= v.serverlist.Size() {
if next >= p.serverlist.Size() {
next = 0
}
v.nextIndex = next
p.nextIndex = next
return server
}

View File

@ -19,11 +19,11 @@ func AlwaysValid() ValidationStrategy {
return AlwaysValidStrategy{}
}
func (v AlwaysValidStrategy) IsValid() bool {
func (AlwaysValidStrategy) IsValid() bool {
return true
}
func (v AlwaysValidStrategy) Invalidate() {}
func (AlwaysValidStrategy) Invalidate() {}
type TimeoutValidStrategy struct {
until time.Time