forked from hashicorp/consul
/
server_lookup.go
66 lines (57 loc) · 1.75 KB
/
server_lookup.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package consul
import (
"fmt"
"sync"
"github.com/hashicorp/consul/agent/metadata"
"github.com/hashicorp/raft"
)
// ServerLookup encapsulates looking up servers by id and address
type ServerLookup struct {
lock sync.RWMutex
addressToServer map[raft.ServerAddress]*metadata.Server
idToServer map[raft.ServerID]*metadata.Server
}
func NewServerLookup() *ServerLookup {
return &ServerLookup{
addressToServer: make(map[raft.ServerAddress]*metadata.Server),
idToServer: make(map[raft.ServerID]*metadata.Server),
}
}
func (sl *ServerLookup) AddServer(server *metadata.Server) {
sl.lock.Lock()
defer sl.lock.Unlock()
sl.addressToServer[raft.ServerAddress(server.Addr.String())] = server
sl.idToServer[raft.ServerID(server.ID)] = server
}
func (sl *ServerLookup) RemoveServer(server *metadata.Server) {
sl.lock.Lock()
defer sl.lock.Unlock()
delete(sl.addressToServer, raft.ServerAddress(server.Addr.String()))
delete(sl.idToServer, raft.ServerID(server.ID))
}
// Implements the ServerAddressProvider interface
func (sl *ServerLookup) ServerAddr(id raft.ServerID) (raft.ServerAddress, error) {
sl.lock.RLock()
defer sl.lock.RUnlock()
svr, ok := sl.idToServer[id]
if !ok {
return "", fmt.Errorf("Could not find address for server id %v", id)
}
return raft.ServerAddress(svr.Addr.String()), nil
}
// Server looks up the server by address, returns a boolean if not found
func (sl *ServerLookup) Server(addr raft.ServerAddress) *metadata.Server {
sl.lock.RLock()
defer sl.lock.RUnlock()
svr, _ := sl.addressToServer[addr]
return svr
}
func (sl *ServerLookup) Servers() []*metadata.Server {
sl.lock.RLock()
defer sl.lock.RUnlock()
var ret []*metadata.Server
for _, svr := range sl.addressToServer {
ret = append(ret, svr)
}
return ret
}