aboutsummaryrefslogtreecommitdiff
path: root/weed/pb/server_discovery.go
blob: 25c0360c5bf297aa2d0c6ce8d7891917d1f0393d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
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
}