| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- package gocql
- import (
- "sync"
- )
- type ring struct {
- // endpoints are the set of endpoints which the driver will attempt to connect
- // to in the case it can not reach any of its hosts. They are also used to boot
- // strap the initial connection.
- endpoints []string
- // hosts are the set of all hosts in the cassandra ring that we know of
- mu sync.RWMutex
- hosts map[string]*HostInfo
- // TODO: we should store the ring metadata here also.
- }
- func (r *ring) getHost(addr string) *HostInfo {
- r.mu.RLock()
- host := r.hosts[addr]
- r.mu.RUnlock()
- return host
- }
- func (r *ring) allHosts() []*HostInfo {
- r.mu.RLock()
- hosts := make([]*HostInfo, 0, len(r.hosts))
- for _, host := range r.hosts {
- hosts = append(hosts, host)
- }
- r.mu.RUnlock()
- return hosts
- }
- func (r *ring) addHost(host *HostInfo) bool {
- r.mu.Lock()
- if r.hosts == nil {
- r.hosts = make(map[string]*HostInfo)
- }
- addr := host.Peer()
- _, ok := r.hosts[addr]
- r.hosts[addr] = host
- r.mu.Unlock()
- return ok
- }
- func (r *ring) addHostIfMissing(host *HostInfo) (*HostInfo, bool) {
- r.mu.Lock()
- if r.hosts == nil {
- r.hosts = make(map[string]*HostInfo)
- }
- addr := host.Peer()
- existing, ok := r.hosts[addr]
- if !ok {
- r.hosts[addr] = host
- existing = host
- }
- r.mu.Unlock()
- return existing, ok
- }
- func (r *ring) removeHost(addr string) bool {
- r.mu.Lock()
- if r.hosts == nil {
- r.hosts = make(map[string]*HostInfo)
- }
- _, ok := r.hosts[addr]
- delete(r.hosts, addr)
- r.mu.Unlock()
- return ok
- }
|