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  }