mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2024-12-21 15:28:14 +08:00
63 lines
1.7 KiB
Go
63 lines
1.7 KiB
Go
|
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
|
||
|
}
|