Implement SRV lookups for filer (#4767)
This commit is contained in:
62
weed/pb/server_discovery.go
Normal file
62
weed/pb/server_discovery.go
Normal file
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user