aboutsummaryrefslogtreecommitdiff
path: root/weed/pb/server_discovery.go
diff options
context:
space:
mode:
Diffstat (limited to 'weed/pb/server_discovery.go')
-rw-r--r--weed/pb/server_discovery.go62
1 files changed, 62 insertions, 0 deletions
diff --git a/weed/pb/server_discovery.go b/weed/pb/server_discovery.go
new file mode 100644
index 000000000..25c0360c5
--- /dev/null
+++ b/weed/pb/server_discovery.go
@@ -0,0 +1,62 @@
+package pb
+
+import (
+ "github.com/seaweedfs/seaweedfs/weed/glog"
+ "reflect"
+)
+
+// ServerDiscovery encodes a way to find at least 1 instance of a service,
+// and provides utility functions to refresh the instance list
+type ServerDiscovery struct {
+ list []ServerAddress
+ srvRecord *ServerSrvAddress
+}
+
+func NewServiceDiscoveryFromMap(m map[string]ServerAddress) (sd *ServerDiscovery) {
+ sd = &ServerDiscovery{}
+ for _, s := range m {
+ sd.list = append(sd.list, s)
+ }
+ return sd
+}
+
+// RefreshBySrvIfAvailable performs a DNS SRV lookup and updates list with the results
+// of the lookup
+func (sd *ServerDiscovery) RefreshBySrvIfAvailable() {
+ if sd.srvRecord == nil {
+ return
+ }
+ newList, err := sd.srvRecord.LookUp()
+ if err != nil {
+ glog.V(0).Infof("failed to lookup SRV for %s: %v", *sd.srvRecord, err)
+ }
+ if newList == nil || len(newList) == 0 {
+ glog.V(0).Infof("looked up SRV for %s, but found no well-formed names", *sd.srvRecord)
+ return
+ }
+ if !reflect.DeepEqual(sd.list, newList) {
+ sd.list = newList
+ }
+}
+
+// GetInstances returns a copy of the latest known list of addresses
+// call RefreshBySrvIfAvailable prior to this in order to get a more up-to-date view
+func (sd *ServerDiscovery) GetInstances() (addresses []ServerAddress) {
+ for _, a := range sd.list {
+ addresses = append(addresses, a)
+ }
+ return addresses
+}
+func (sd *ServerDiscovery) GetInstancesAsStrings() (addresses []string) {
+ for _, i := range sd.list {
+ addresses = append(addresses, string(i))
+ }
+ return addresses
+}
+func (sd *ServerDiscovery) GetInstancesAsMap() (addresses map[string]ServerAddress) {
+ addresses = make(map[string]ServerAddress)
+ for _, i := range sd.list {
+ addresses[string(i)] = i
+ }
+ return addresses
+}