diff options
| author | Nico D'Cotta <45274424+Cottand@users.noreply.github.com> | 2023-08-24 16:08:56 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-08-24 07:08:56 -0700 |
| commit | 796b7508f33916f7fa734e3df2ceea9a80415ade (patch) | |
| tree | 4bc3913d93e1e328fd8f7275b11452e61d8175d2 /weed/pb/server_discovery.go | |
| parent | 5251b4d50ea55c5f0a2fbc60206785bf80775bac (diff) | |
| download | seaweedfs-796b7508f33916f7fa734e3df2ceea9a80415ade.tar.xz seaweedfs-796b7508f33916f7fa734e3df2ceea9a80415ade.zip | |
Implement SRV lookups for filer (#4767)
Diffstat (limited to 'weed/pb/server_discovery.go')
| -rw-r--r-- | weed/pb/server_discovery.go | 62 |
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 +} |
