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