|
|
@@ -0,0 +1,74 @@
|
|
|
+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) bool {
|
|
|
+ r.mu.Lock()
|
|
|
+ if r.hosts == nil {
|
|
|
+ r.hosts = make(map[string]*HostInfo)
|
|
|
+ }
|
|
|
+
|
|
|
+ addr := host.Peer()
|
|
|
+ _, ok := r.hosts[addr]
|
|
|
+ if !ok {
|
|
|
+ r.hosts[addr] = host
|
|
|
+ }
|
|
|
+ r.mu.Unlock()
|
|
|
+ return 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
|
|
|
+}
|