Jelajahi Sumber

add a ring struct to hold ring info for a session

Chris Bannister 10 tahun lalu
induk
melakukan
1c1044ce9a
2 mengubah file dengan 75 tambahan dan 0 penghapusan
  1. 74 0
      ring.go
  2. 1 0
      session.go

+ 74 - 0
ring.go

@@ -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
+}

+ 1 - 0
session.go

@@ -36,6 +36,7 @@ type Session struct {
 	schemaDescriber     *schemaDescriber
 	trace               Tracer
 	hostSource          *ringDescriber
+	ring                ring
 	mu                  sync.RWMutex
 
 	hostFilter HostFilter